この記事では、単純なIPアドレスジェネレーターを作成するプロセスについて説明します。 この記事は初心者向けです。 開発環境はそれほど重要ではありません-IDLEで記述することは完全に可能で、問題はないはずですが、EclipseをPyDevプラグインとともに使用します。
プログラムは正確に何をしますか?
IPv4を介したコンピューターアドレスの表現は、記録しやすいように4つのブロックに分割された32ビットの数値です。 このようなブロックを生成します。 多くの場合、IPアドレスやプロキシなどのリストがテキストファイルとともにサードパーティのプログラムに読み込まれるため、この形式の出力は便利です。
具体的には、ユーザーが指定する必要がある最初のパラメーターは、生成する必要があるアドレスの数になります。
generator()関数を書きます
ユーザーが数量を決定することに同意したので、引数
amount
を渡す
generator()
関数を作成します。
def generator(amount): for n in range(amount): # , 4 a = randint(0,255) b = randint(0,255) c = randint(0,255) d = randint(0,255) # f = open('ip-addresses.txt', 'a', encoding='utf-8') f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+'\n') f.close() # ? print('Success!')
whileループは非常に高速に実行されるため、forループを使用します。 ランダムモジュールをインポートすることを忘れないでください(または、名前空間を詰まらせないように、
from random import randint
方が良い)。
TkinterのGUI
おそらく、必要なものはすべてあるので、少し後で機能を追加し、グラフィカルインターフェイスの作成を開始します。 Tkinterライブラリを使用します。
ロシア語でのそれに関する詳細なドキュメントはここにあります 。
入力フィールド(
Entry
ウィジェット)、ボタン(
Button
ウィジェット)、できればログ出力フィールドを作成し、プログラムの名前を追加して、目的が一目でわかるようにする必要があります。
from tkinter import * # root = Tk() label1=Label(root, text=" ip-") label1.grid() # Frame, frame = Frame(root) frame.grid() label2=Label(frame, text=':') label2.grid(row=1,column=1) # entry_amount = Entry(frame, width=4, borderwidth=5) entry_amount.grid(row=1,column=2) # button1 = Button(frame, text="") button1.grid(row=1, column=3, padx=(10,0)) # output = Text(frame, bg="lightblue", font="Arial 9", width=45, height=3) output.grid(row=2, columnspan=8) root.mainloop()
テーブルレイアウトの原則に従って要素を配置するグリッドパッカーを使用します。 コンパイル後、ウィンドウは次のようになります。
入力されたパラメーターを処理します
次に、「生成」ボタンをクリックしたときに入力フィールドに入力された金額を読み取り、ジェネレーターに渡す関数を作成する必要があります。 この場合、ユーザーが数字以外を入力した場合、関数がログフィールドにエラーメッセージを表示することは価値があります。 これを行うには、try-exceptコンストラクトを使用します。
def handler(): try: # .get() amount = int(entry_amount.get()) generator(amount) except ValueError: notif(" ") # , def notif(value): output.delete("0.0","end") # output.insert("0.0",value)
ここでは、他のエラーを出力する必要があるときに関数を記述するときにコードを簡素化するために、write引数が渡される
def notif(value)
関数を個別に作成しました。 また、ハンドラー関数
command=handler
(最後に括弧なし)の値を使用して、ウィジェットの説明
button1
メソッドを追加する必要があり
button1
。
ウィジェットの説明は次のようになります。
button1 = Button(frame, text="", command=handler)
command
メソッドを追加するとき、
from distutils import command
記述する必要がある場合があります。 実際、プログラムはその主なタスクを実行します。
あらゆる種類の有用性を追加する
「ファイルを削除」ボタン
プログラムの正しさをチェックするとき、テキストファイルを手動で削除するのが不便になったので、「ファイルの削除」ボタンを追加してみませんか?
def delete()
関数を作成します。
def delete(): try: remove('ip-addresses.txt') inserter(" ip-addresses.txt ") except: inserter(" ")
ファイル名は気にしませんでしたが、必要に応じて、出力にカスタムファイル名を実装(および対応するファイルを削除)できます。 次に、
delete
を呼び出すボタンを作成します。
button2 = Button(frame, text=" ", command=delete) button2.grid(row=1, column=4, padx=(10,0))
グリッドパッカーでは、このボタンを
frame
フィールドの最初の行、4番目の列に配置しました。
from os import remove
からimportsに行を追加することを忘れないでください。 「削除」ボタンですべてがわかりました。
プログレスバー
500以上のアドレスを含むIPリストを生成すると、プログラムがforループを処理するのに時間がかかることがわかります。 ユーザーがプログラムがフリーズすることを考えないように、単純なプログレスバーを実装します。
すぐに言いたい:Tkinterはこの目的には適していない。 コンパイラはforループ中にGUIウィンドウを処理できないため、Tkinterのウィンドウに進行メッセージを表示することはできません。たとえ移動ごとにメッセージを表示しなくても、たとえば、10移動後でも100移動後に。 とにかく、コンパイラーはループの最後の実行のみを出力できます(言い換えると、Tkinterはこの方法で99%のみを出力します)。 つまり、残念ながら、同じウィンドウにコーシャプログレスバーを作成することは、従来の方法では機能しません。 そのため、プログラムのメインインターフェイスの背景に対してログターミナル(通常のコンソール)を開き、その中に生成の進行状況を表示するのが最も論理的です。 注:ユーザーが使い慣れた形式のコンソールは、エクスプローラーからプログラムが起動されたときにのみ開きます。 コンパイラから起動すると、メッセージがコンパイラコンソールに表示されます。
generator
関数を完成させます:
def generator(amount, port=''): for n in range(amount): a = randint(0,255) b = randint(0,255) c = randint(0,255) d = randint(0,255) f = open('ip-addresses.txt', 'a', encoding='utf-8') f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n') f.close() # prc , n amount , amount — 100% prc = int(n//(amount/100)) print(str(prc)+'%') print('Success!') # GUI txt- notif("IP- \nip-addresses.txt")
コンパイルして、500個のリスト(アドレスなど)を生成します。 コンソールに次が表示されます。
わあ そして、過剰な繰り返し関心を取り除く方法は? 小さな自転車を作成し、以前の値を保存します。
def generator(amount, port=''): prc_bfr=0 # for n in range(amount): a = randint(0,255) b = randint(0,255) c = randint(0,255) d = randint(0,255) f = open('ip-addresses.txt', 'a', encoding='utf-8') f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n') f.close() prc = int(n//(amount/100)) #, prc if(prc!=prc_bfr): print(str(prc)+'%') prc_bfr = prc print('Success!') notif("IP- \nip-addresses.txt")
できた! 進行状況バーでは、整理されていると想定します。
IPアドレスにポートを追加する
しかし、たとえばポート8080のIPリストが必要な場合はどうなりますか? この関数を追加します。 GUIから始めましょう。2つのモードを定義する2つの
Radiobutton
ウィジェットを追加します。ポートありとポートなしの生成です。 また、
Entry
ウィジェットを追加してポートを入力する必要があります。
label2 = Label(frame, text=' :') label2.grid(row=2,column=1) entry_port = Entry(frame, width=4, borderwidth=5, state=DISABLED) entry_port.grid(row=2,column=2) # var1 radiobutton' var1 = IntVar() check_port1 = Radiobutton(frame, text=' ', variable=var1, value=1, command=lock) check_port1.grid(row=2,column=3) check_port2 = Radiobutton(frame, text=" ", variable=var1, value=0, command=lock) check_port2.grid(row=2,column=4)
entry_port
デフォルトで
entry_port
です。 各
check_port
は、アクティベーション時に
lock()
関数を実行し、それに応じてポート入力フィールドを非表示/アクティベートします。
lock
機能について説明しましょう。
def lock(): # check_port2: if var1.get() == 1: entry_port.configure(state=NORMAL) # check_port1: elif var1.get() == 0: entry_port.configure(state=DISABLED)
GUIは次のようになります。
if-elseコンストラクトをハンドラー
handler
関数に追加します。これは、生成モード(
var1
の値)に応じて実行されます。
def handler(): try: amount = int(entry_amount.get()) # if var1.get() == 1: port = ':'+str(int(entry_port.get())) # int , str, generator(amount, port) else: # — generator(amount) except ValueError: notif(" /")
停止、ジェネレーター関数は引数を1つだけ取ります。 次に、それに戻り、次のように宣言します。
def generator(amount, port='')
関数の宣言に
port
引数の初期化を直接追加することにより、オプションを追加しました。関数は、ポートを使用した生成モードで呼び出されたときに値を変更します。 テキストファイルに書き込むときにも追加します。
f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n')
最終的に、プログラムのソースコード:
import tkinter import random from tkinter import * from random import randint from os import remove from distutils import command print('Logs terminal:') def generator(amount, port=''): prc_bfr=0 for n in range(amount): a = randint(0,255) b = randint(0,255) c = randint(0,255) d = randint(0,255) f = open('ip-addresses.txt', 'a', encoding='utf-8') f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n') f.close() prc = int(n//(amount/100)) if(prc!=prc_bfr): print(str(prc)+'%') prc_bfr = prc print('Success!') notif("IP- \nip-addresses.txt") def notif(value): output.delete("0.0","end") output.insert("0.0",value) def handler(): try: amount = int(entry_amount.get()) if var1.get() == 1: port = ':'+str(int(entry_port.get())) generator(amount, port) else: generator(amount) except ValueError: notif(" /") def delete(): try: remove('ip-addresses.txt') notif(" ip-addresses.txt ") except: notif(" ") def lock(): if var1.get() == 1: entry_port.configure(state=NORMAL) elif var1.get() == 0: entry_port.configure(state=DISABLED) root = Tk() label1=Label(root, text=" ip-") label1.grid() frame = Frame(root) frame.grid() label2=Label(frame, text=':') label2.grid(row=1,column=1) entry_amount = Entry(frame, width=4, borderwidth=5) entry_amount.grid(row=1,column=2) button1 = Button(frame, text="", command=handler) button1.grid(row=1, column=3, padx=(10,0)) button2 = Button(frame, text=" ", command=delete) button2.grid(row=1, column=4, padx=(10,0)) label2=Label(frame, text=' :') label2.grid(row=2,column=1) entry_port = Entry(frame, width=4, borderwidth=5, state=DISABLED) entry_port.grid(row=2,column=2) var1 = IntVar() check_port1 = Radiobutton(frame, text=' ', variable = var1, value=1, command=lock) check_port1.grid(row=2,column=3) check_port2 = Radiobutton(frame, text=" ", variable = var1, value=0, command=lock) check_port2.grid(row=2,column=4) output = Text(frame, bg="lightblue", font="Arial 9", width=45, height=3) output.grid(row=3, columnspan=8) root.mainloop()
それだけです もちろん、ソート、特定のアドレス範囲内での生成など、より多くの興味深い関数を追加したり、無料のproxy.ruパーサーを作成することもできますが、このような単純なジェネレーターはPythonの最初の練習に役立ちます。