2012-01-12 22 views
6

Estoy ejecutando Python 3.2.2 y escribiendo algún código para probar los sockets. Para facilitar la prueba, estoy usando Tkinter para agregar una interfaz GUI. Lo que todavía tengo que averiguar es cómo actualizar la información en la grilla que estoy usando. Quiero actualizar "host2" y "port2" en las funciones "change1" y "change3" en el código siguiente:Python/Tkinter Cómo actualizar la información en la cuadrícula

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

Cualquier ayuda en el asunto sería muy apreciado! ¡Gracias!

Respuesta

10

Sus problemas comienzan con esta línea:

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

Lo que está haciendo es crear una etiqueta, utilizando la rejilla para colocar la etiqueta en la pantalla, a continuación, asignar host1el resultado del comando rejilla() , que es la cadena vacía Esto hace que sea imposible referirse más tarde al host1 para obtener una referencia a la etiqueta.

En su lugar, debe guardar una referencia a la etiqueta. Con referencia que más tarde puede cambiar cualquier cosa que quieran de la etiqueta:

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

Tomar de alguien con más de una década de experiencia con los conocimientos tradicionales, es mejor separar su creación y el diseño de widgets. Es casi seguro que su diseño cambiará a lo largo del desarrollo y es mucho más fácil hacerlo cuando todo su código de diseño está en un solo lugar. Mis diseños pueden cambiar mucho, pero mi conjunto de widgets de trabajo raramente lo hace, así que termino solo teniendo que cambiar un bloque de código en lugar de docenas de líneas individuales intercaladas con otro código.

Por ejemplo, el código general se ve más o menos así:

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

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

Por supuesto, yo uso mucho mejor los nombres de variables.

Cuestiones relacionadas