Python/Tkinter как обновить информацию в сетке
Я запускаю Python 3.2.2 и пишу код для тестирования сокетов. Для удобства тестирования я использую Tkinter для добавления интерфейса GUI. Мне еще предстоит выяснить, как обновить информацию в сетке, которую я использую. Я хочу обновить "host2" и "port2" в функциях "change1" и "change3" в следующем коде:
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()
любая помощь по этому вопросу будет высоко ценится! Спасибо!
1 ответов
ваши проблемы начинаются с этой строки:
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(...)
конечно, я использую гораздо лучшие имена переменных.