StringVar()。set()不调整StringVar

时间:2019-06-18 06:04:46

标签: python tkinter

我是一个初学者,学习Python并熟悉tkinter GUI内容。我正在尝试创建一个非常基础的初学者项目,该项目允许用户在文本框中键入内容并单击按钮,然后将输入添加到窗口另一部分的标签中。

但是,我遇到了一个问题,即我用作输出的StringVar无法通过.set()命令进行更新。

    def __init__(self):
        self.window = Tk()
        self.window.title("Terminal Writer 9000!")
        self.terminalString = StringVar()
        self.terminalString.set("This is an example message.")
        self.allcontent = ttk.Frame(self.window)
        self.allcontent.grid(row=0, column=0, sticky="nwse")
        self.mainframe = ttk.Frame(self.allcontent)
        self.mainframe.grid(row=0, column=0, sticky = "nwse", columnspan=4, rowspan=5)
        self.terminal = ttk.Label(self.mainframe, textvariable=self.terminalString, padding=10, relief="sunken") 
        self.terminal.grid(row=0, column=0, rowspan=5, columnspan=2, sticky="nwse")
        # GUI setup for Buttons and Entry box omitted...

play = TerminalWriterApp()
play.window.mainloop()

但是,终端标签使用的区域为空白,即使它应该显示“这是示例消息”。在进行故障排除时,我做了这个,基本上是对原始代码的功能元素的完整复制/粘贴:

from tkinter import *
from tkinter import ttk

window = Tk()

strvar = StringVar()
strvar.set("Test 2")

allcontent = ttk.Frame(window)
allcontent.grid(row=0, column=0, sticky="nwse")

mainframe = ttk.Frame(allcontent)
mainframe.grid(row=0, column=0, sticky="nwse", columnspan=4, rowspan=5)

text = Label(mainframe, text="Test 1")
text.grid(row=0, column=0, sticky="nwse")

text2 = Label(mainframe, textvariable=strvar)
text2.grid(row=1, column=0, sticky="nwse")

window.mainloop()

此代码按预期功能运行,在单独的行上显示一个带有“测试1”和“测试2”的窗口。

有人知道为什么set()方法在这种情况下不起作用吗? (此外,请随时对我的糟糕代码感到生气-我需要以某种方式学习好习惯!)

1 个答案:

答案 0 :(得分:0)

由于某些原因,当应用程序获得焦点时(当您单击它时)会显示标签;也许是因为堆栈嵌套框架IDK。

您可以使用focus_force来限制操作系统,以便立即将重点放在您的应用上。

from tkinter import *
from tkinter import ttk


class TerminalWriterApp:
    def __init__(self):
        self.window = Tk()
        self.window.title("Terminal Writer 9000!")

        self.terminalString = StringVar()
        self.terminalString.set("This is an example message.")

        self.allcontent = ttk.Frame(self.window)
        self.allcontent.grid(row=0, column=0, sticky="nwse")

        self.mainframe = ttk.Frame(self.allcontent)
        self.mainframe.grid(row=0, column=0, sticky = "nwse", columnspan=4, rowspan=5)

        self.terminal = ttk.Label(self.mainframe, textvariable=self.terminalString, padding=10, relief="sunken") 
        self.terminal.grid(row=0, column=0, rowspan=5, columnspan=2, sticky="nwse")

        self.terminal.focus_force()

play = TerminalWriterApp()
play.window.mainloop()