Python / Tkinter如何更新网格中的信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python / Tkinter如何更新网格中的信息相关的知识,希望对你有一定的参考价值。

我正在运行Python 3.2.2并编写一些代码来测试套接字。为了便于测试,我使用Tkinter添加GUI界面。我还没弄清楚如何更新我正在使用的网格中的信息。我想更新以下代码中的“change1”和“change3”函数中的“host2”和“port2”:

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

任何有关此事的帮助将不胜感激!谢谢!

答案

你的问题从这一行开始:

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

当然,我使用更好的变量名称。

另一答案

首先,在深入研究这个问题之前。我想突出一些事情。在这一行。

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

我希望您将网格部分与变量的声明分开。因为它会创建一个无法使用的No Type对象。它将在未来产生许多问题,可能会花费你很多时间。如果你有任何像这样结构的变量,它们不仅仅是作为文本行提供的。将该变量的结构更改为我上面描述的结构。无论如何,回到你在哪里说,但更深入的是改变标签的文本。如果要通过函数更改它将在您希望更改Label文本的函数中,我会怎么做。放这样的行。

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

# or

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

这会将标签的文本更改为新更改的文本,或者换句话说,将文本替换为新文本。

以上是关于Python / Tkinter如何更新网格中的信息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tkinter ~ python 中放置在网格中的两个小部件之间添加空间?

Python tkinter 如何使用网格粘性

Tkinter 中的框架是不是包含本地网格系统?

python基础 Tkinter 之 几何管理器

python基础 Tkinter 之 几何管理器

在 Windows,Python3.8 上使用多处理时如何更新 tkinter 应用程序中的状态