2012-01-12 28 views
6

Tôi đang chạy Python 3.2.2 và viết một số mã để kiểm tra ổ cắm. Để dễ dàng kiểm tra, tôi đang sử dụng Tkinter để thêm giao diện GUI. Những gì tôi chưa tìm ra là làm thế nào để cập nhật thông tin trong lưới tôi đang sử dụng. Tôi muốn cập nhật "host2" và "port2" trong chức năng "change1" và "change3" trong đoạn mã sau:Python/Tkinter Cách cập nhật thông tin trong lưới

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

Bất kỳ giúp đỡ về vấn đề này sẽ được nhiều đánh giá cao! Cảm ơn!

Trả lời

10

vấn đề của bạn bắt đầu với dòng này:

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

gì bạn đang làm là tạo ra một nhãn, sử dụng lưới để đặt nhãn trên màn hình, sau đó gán host1kết quả của lưới điện() lệnh , đó là chuỗi rỗng. Điều này làm cho nó không thể sau đó tham khảo host1 để có được một tham chiếu đến nhãn.

Thay vào đó, bạn cần phải lưu tham chiếu đến nhãn. Với tham chiếu đó, sau này bạn có thể thay đổi bất kỳ thứ gì bạn muốn về nhãn:

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

Lấy từ một người có kinh nghiệm hơn một thập niên, tốt hơn là tách riêng bố cục và bố cục tiện ích của bạn. Bố cục của bạn gần như chắc chắn sẽ thay đổi trong quá trình phát triển và dễ dàng hơn khi thực hiện điều đó khi tất cả mã bố cục của bạn ở cùng một nơi. Bố trí của tôi có thể thay đổi rất nhiều nhưng bộ tiện ích con của tôi hiếm khi làm, vì vậy tôi chỉ phải thay đổi một khối mã thay vì hàng tá dòng riêng lẻ xen kẽ với mã khác.

Ví dụ, mã của tôi thường trông gần như thế này:

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

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

Tất nhiên, tôi sử dụng nhiều tên biến tốt hơn.

Các vấn đề liên quan