2012-01-12 58 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!") 

与把它从别人超过传统知识十年的经验,最好是单独的窗口小部件创建和布局。您的布局在开发过程中几乎肯定会发生变化,并且当您的所有布局代码位于同一位置时,这样做会更容易。我的布局可能会发生很大的变化,但我的工作集很少会这样做,所以我最终只需更改一个代码块,而不是与其他代码交错的几十行代码。

例如,我的代码通常看起来大致是这样的:

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

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

当然,我用更好的变量名。