ホイッスル、缶、グラフィカルシェルTkinterを使用したPython IPアドレスジェネレーターの作成

汎用プログラミング言語を学ぶ最初のPythonの1つとしてPythonを選んだ人は、UPDクライアント、簡単なテキストエディターなど、実務でのスキルを磨くための印象的な数の小さなプログラムを書くことに熱心です。



この記事では、単純な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の最初の練習に役立ちます。



All Articles