2012-01-12 3 views
6

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

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

Смежные вопросы