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(...)

конечно, я использую гораздо лучшие имена переменных.