Python / Tkinter Как обновить информацию в сетке - PullRequest
6 голосов
/ 12 января 2012

Я использую Python 3.2.2 и пишу код для тестирования сокетов. Для удобства тестирования я использую Tkinter для добавления интерфейса с графическим интерфейсом. Что мне еще предстоит выяснить, так это как обновить информацию в сетке, которую я использую. Я хочу обновить "host2" и "port2" в функциях "change1" и "change3" в следующем коде:

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 ]

11 голосов
/ 12 января 2012

Ваши проблемы начинаются с этой строки:

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

То, что вы делаете, - это создание метки, использование сетки для размещения метки на экране, а затем присвоение host1 результатаgrid () команда , которая является пустой строкой.Это делает невозможным последующее обращение к host1 для получения ссылки на метку.

Вместо этого вам необходимо сохранить ссылку на метку.С помощью этой ссылки вы позже сможете изменить все, что захотите в метке:

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

Возьмите это у кого-то с более чем десятилетним опытом работы с tk, лучше разделить создание виджета и макет.Ваш макет почти наверняка изменится в процессе разработки, и это гораздо проще сделать, когда весь код макета находится в одном месте.Мои макеты могут сильно изменяться, но мой рабочий набор виджетов редко меняется, поэтому мне приходится только менять один блок кода, а не десятки отдельных строк, чередующихся с другим кодом.

Например, мой код обычно выглядит примерно так:

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

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

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

0 голосов
/ 30 апреля 2019

Во-первых, прежде чем углубляться в эту проблему.Я хочу выделить несколько вещей.В этой строке.

host2 = Label(frame,text=HOST,width=10).grid(row=0,column=1)

Я хочу, чтобы вы отделили часть гридинга от объявления переменной.Потому что это создаст объект No Type, с которым вы не можете работать.В будущем это создаст много проблем, которые могут занять много времени.Если у вас есть какие-либо переменные, структурированные таким образом, которые не будут просто служить строками текста.Измените структуру этой переменной на структуру, которую я описал выше.В любом случае, возвращаясь к тому, что вы говорите, но более подробно вы можете изменить текст ярлыков.Что бы я сделал, если функция будет изменена функцией, в той функции, которую вы хотите изменить в тексте метки.Поместите в строки, как это.

host2['text'] = 'Your New Text'
port2['text'] = 'Your New Text'

# or

host2.configure(text = 'Your New Text')
port2.configure(text = 'Your New Text')

Это изменит текст ваших меток на недавно измененный текст или Другими словами, заменит текст новым текстом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...