2012-01-12 21 views
6

私はPython 3.2.2を実行していて、ソケットをテストするためのコードを書いています。テストの容易さのために、Tkinterを使用してGUIインターフェイスを追加しています。私がまだ把握していないのは、私が使っているグリッドの情報を更新する方法です。私は、次のコードで関数「change1」で「ホスト2」と「ポート2」を更新し、「change3」にしたい:Python/Tkinterグリッドの情報を更新する方法

import socket 
from tkinter import * 
import tkinter.simpledialog 

root = Tk() 
root.title("Server") 
root.iconbitmap("etc.ico") 
root.geometry("350x100+200+200") 
frame = Frame(root) 
host1 = Label(frame,text="Host: ").grid(row=0,column=0) 
port1 = Label(frame,text="Port: ").grid(row=1,column=0) 
HOST = 'localhost' 
PORT = 11111 
STATUS = 'EMPTY' 
host2 = Label(frame,text=HOST,width=10).grid(row=0,column=1) 
port2 = Label(frame,text=PORT,width=10).grid(row=1,column=1) 
status1 = Label(root,text=STATUS) 
status1.pack(side=RIGHT,padx=2,pady=2) 

def change1(): 
    global HOST 
    HOST= tkinter.simpledialog.askstring(title="Host",prompt="Enter the IP of the Host.") 
    host2.grid_forget() 
def change3(): 
    global PORT 
    PORT= tkinter.simpledialog.askinteger(title="Port",prompt="Enter the Port of the IP.") 
    port2.grid_forget() 
def go1(): 
    global HOST 
    global PORT 
    home = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    home.bind((HOST, PORT)) 
    home.listen(1) 
    conn, addr = home.accept() 
    print (addr) 
    while 1: 
     data = conn.recv(1024) 
     if not data: break 
     global STATUS 
     STATUS = data.decode('UTF-8') 
     conn.send(bytes('Received "Hello World"','UTF-8')) 
    conn.close() 
    global status1 
    status1.pack_forget() 
    status1.pack(side=RIGHT,padx=2,pady=2) 

change = Button(frame, text="Change Host", width=10,command=change1).grid(row=0,column=2) 
change2 = Button(frame, text="Change Port", width=10,command=change3).grid(row=1,column=2) 
go = Button(frame, text="GO!",command=go1,width =10).grid(row=2,column=2) 
frame.pack(side=LEFT) 

mainloop() 

問題上の任意のヘルプははるかに高く評価されるだろう!ありがとう!

答えて

10

あなたの問題は、この行で始まる:

host1 = Label(frame,text="Host: ").grid(row=0,column=0) 

あなたはその後、host1グリッド()コマンドの結果を割り当て、画面上のラベルを配置するためにグリッドを使用して、ラベルを作成してやっていますこれは空の文字列です。これにより、後でhost1を参照してラベルへの参照を取得することができなくなります。

代わりに、ラベルへの参照を保存する必要があります。その参照を使用すると、後でラベルについてあなたが欲しいものを変更することができます。

host1 = Label(frame, text="Host: ") 
host1.grid(row=0, column=0) 
... 
if (something_has_changed): 
    host1.configure(text="Hello, world!") 

はTKの経験の十年と誰かからそれを取る、それはあなたのウィジェットの作成とレイアウトを分離する方が良いでしょう。あなたのレイアウトは開発の過程でほぼ確実に変化し、すべてのレイアウトコードが1つの場所にあるときは、それを行うほうがはるかに簡単です。私のレイアウトは大きく変わるかもしれませんが、私の作業用ウィジェットセットはほとんどありませんので、他のコードとインターリーブされた数十の個々のラインではなく、一ブロックのコードを変更するだけで済むようになります。例えば

、私のコードは、一般的におおよそ以下のようになります。私はより良い変数名を使用し、もちろん

labell = tk.Label(...) 
label2 = tk.Label(...) 
entry1 = tk.Entry(...) 

label1.grid(...) 
label2.grid(...) 
entry1.grid(...) 

関連する問題