我正在运行Python 3.2.2并编写一些代码来测试套接字。为了便于测试,我使用Tkinter添加GUI界面。我还没弄清楚如何更新我正在使用的网格中的信息。我想更新以下代码中的“change1”和“change3”函数中的“host2”和“port2”:
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()
对此事的任何帮助将不胜感激!谢谢!
答案 0 :(得分:11)
你的问题始于这一行:
host1 = Label(frame,text="Host: ").grid(row=0,column=0)
您正在做的是创建标签,使用网格将标签放在屏幕上,然后为host1
分配grid()命令的结果,这是空字符串。这使得以后无法引用host1
来获取对标签的引用。
相反,您需要保存对标签的引用。通过该参考,您可以稍后更改标签上的任何内容:
host1 = Label(frame, text="Host: ")
host1.grid(row=0, column=0)
...
if (something_has_changed):
host1.configure(text="Hello, world!")
从拥有超过十年tk经验的人那里获取它,最好将小部件创建和布局分开。您的布局几乎肯定会在开发过程中发生变化,当您将所有布局代码放在一个位置时,这样做会容易得多。我的布局可能会发生很大的变化,但我的工作小部件很少,所以我最终只需更改一个代码块而不是几十个单独的行与其他代码交错。
例如,我的代码通常看起来大致如下:
labell = tk.Label(...)
label2 = tk.Label(...)
entry1 = tk.Entry(...)
label1.grid(...)
label2.grid(...)
entry1.grid(...)
当然,我使用更好的变量名称。
答案 1 :(得分:0)
首先,在深入探讨此问题之前。我想强调一些事情。在这一行。
host2 = Label(frame,text=HOST,width=10).grid(row=0,column=1)
我希望您将网格化部分与变量的声明分开。因为它将创建一个不能使用的No Type对象。将来会产生许多问题,可能会花费您很多时间。如果您有任何这样构造的变量,这些变量不仅将用作文本行。将该变量的结构更改为我上面描述的结构。无论如何,回到您所说的地方,但更深入的是更改标签的文本。如果要通过功能更改它,该怎么办就是要更改Label的文本。放入这样的行。
host2['text'] = 'Your New Text'
port2['text'] = 'Your New Text'
# or
host2.configure(text = 'Your New Text')
port2.configure(text = 'Your New Text')
这会将标签的文本更改为新更改的文本,或者换句话说,将文本替换为新文本。