2012-01-12 6 views
6

Sto eseguendo Python 3.2.2 e scrivendo del codice per testare i socket. Per la facilità del test, sto usando Tkinter per aggiungere un'interfaccia GUI. Quello che devo ancora capire è come aggiornare le informazioni nella griglia che sto usando. Voglio aggiornare "host2" e "port2" nelle funzioni "change1" e "change3" nel codice seguente:Python/Tkinter Come aggiornare le informazioni nella griglia

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

Qualsiasi aiuto sulla questione sarebbe molto apprezzato! Grazie!

risposta

10

I suoi problemi cominciano con questa linea:

host1 = Label(frame,text="Host: ").grid(row=0,column=0) 

Quello che state facendo è la creazione di un'etichetta, utilizzando griglia per posizionare l'etichetta sullo schermo, quindi assegnando host1il risultato del comando griglia() , che è la stringa vuota. Ciò rende impossibile fare successivamente riferimento a host1 per ottenere un riferimento all'etichetta.

Invece, è necessario salvare un riferimento all'etichetta. Con riferimento che in seguito sarà possibile modificare tutto quello che vuoi su l'etichetta:

host1 = Label(frame, text="Host: ") 
host1.grid(row=0, column=0) 
... 
if (something_has_changed): 
    host1.configure(text="Hello, world!") 

Prendere da qualcuno con oltre un decennio di esperienza con tk, è meglio separare la tua creazione e il layout dei widget. Il tuo layout cambierà quasi certamente nel corso dello sviluppo ed è molto più facile farlo quando tutto il tuo codice di layout è in un posto. I miei layout possono cambiare molto, ma raramente il mio working set di widget lo fa, quindi alla fine devo solo cambiare un blocco di codice piuttosto che dozzine di singole linee intercalate con altri codici.

Per esempio, il mio codice in generale sembra grosso modo così:

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

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

Naturalmente, io uso molto meglio i nomi delle variabili.