2012-01-12 2 views
6

저는 Python 3.2.2를 실행 중이고 소켓 테스트를위한 코드를 작성하고 있습니다. 테스팅의 편의를 위해 Tkinter를 사용하여 GUI 인터페이스를 추가했습니다. 아직 파악하지 못한 것은 내가 사용하고있는 그리드의 정보를 업데이트하는 방법입니다.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() 

이 문제에 어떤 도움이 많이 주시면 감사하겠습니다 : 나는 다음과 같은 코드에서 "호스트 2"와 "PORT2" "change1"기능과 "3 변경"을 업데이트 할! 감사!

답변

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!") 

는 TK 경험 10 년 이상 가진 사람에서 그것을 가지고, 당신의 위젯 생성 및 레이아웃을 분리하는 것이 좋습니다. 귀하의 레이아웃은 개발 과정에서 거의 확실하게 바뀔 것이며 모든 레이아웃 코드가 한 곳에 모일 때 훨씬 쉽게 할 수 있습니다. 레이아웃이 많이 바뀔 수는 있지만 위젯을 사용하는 경우는 거의 없습니다. 따라서 다른 코드와 수십 개의 개별 코드가 인터리브 된 것이 아니라 한 개의 코드 블록 만 변경하면됩니다. 예를 들어

는, 내 코드는 일반적으로 다음과 같이 대략 같습니다 물론

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

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

, 내가 더 나은 변수 이름을 사용합니다.

관련 문제