Tkinter的一个小小的规则,如果不了解,可能不会解决掉这个问题


如何控制变量在Tkinter中的使用?这节课木辛老师来给大家说道说道。


请点击右上角“关注”按钮关注我们哟:跟着木辛老师学习Python编程知识,变身快乐的编程达人吧~


大家好,木辛老师又来了!


上节课咱们初次见到Tkinter制作的窗口,并且增加了简单的事件交互。

新朋友第一次见面是不是非常开心。希望通过木辛老师的Tkinter编程课堂,可以让大家和Tkinter成为非常好的朋友。


这节课咱们再来进一步认识一下Tkinter。


上一个例子还是太简单了,我们不禁在想,能不能做得好玩一点,通过某些动作,修改一下窗口上显示的内容?

答案是肯定的,通过Tkinter非常简单就可以实现这个功能。


Tkinter的一个小小的规则,如果不了解,可能不会解决掉这个问题


好!上代码。

<code>import tkinter as tk

class Window(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Hello")
        self.label_text = "choose"


        self.label = tk.Label(self, text=self.label_text)
        self.label.pack(fill=tk.BOTH, expand=1, padx=100, pady=30)


        hello_button = tk.Button(self, text="Say Hello", command=self.say_hello)
        hello_button.pack(side=tk.LEFT, padx=(20, 0), pady=(0, 20))


        goodbye_button = tk.Button(self, text="Say GoodBye", command=self.say_goodbye)
        goodbye_button.pack(side=tk.RIGHT, padx=(0, 20), pady=(0, 20))


    def say_hello(self):
        self.label_text = "welcome"


    def say_goodbye(self):
        self.label_text = "Goodbye! \\n (Closing in 2 seconds)"
        self.after(2000, self.destroy)


if __name__ == "__main__":
    window = Window()
    window.mainloop()

/<code>

执行程序,效果图就像这样

Tkinter的一个小小的规则,如果不了解,可能不会解决掉这个问题

然后,我狂点say按钮,发现并没有什么反应。这是为什么呢?明明已经设置内容了呀?


Tkinter的一个小小的规则,如果不了解,可能不会解决掉这个问题


咱们来看下代码

<code>def say_hello(self):
        self.label_text = "welcome"/<code>

上节课,木辛老师讲过,将变量和Label控件关联起来,如果变量的内容会反映到控件上。

为什么在这里更改文本不起作用呢?而点击good_bye_button却可以执行关闭窗口的操作。

<code>def say_goodbye(self):
        self.label_text = "Goodbye! \\n (Closing in 2 seconds)"
        self.after(2000, self.destroy)/<code>

通过分析,可以看出来,其实代码逻辑是执行了,但是”跳过了“设置文本这一行。

这貌似不太正常!


Tkinter的一个小小的规则,如果不了解,可能不会解决掉这个问题


其实呀,这里代码编写的有一点点不对。

哪里的问题呢?

之所以变量的值没有更新,是因为在Tkinter中,更新变量的值,我们需要使用Tkinter自己”认可“的方式。

需要按照Tkinter自己的格式定义。

比如:

  • (1)使用字符串类型,需要使用StringVar类型定义:label_text = tk.StringVar()
  • (2)整型则需要使用 label_text = tk.IntVar()
  • (3)双精度则使用label_text = tk.DoubleVar()
  • (4)布尔型则对应的label_text = tk.BooleanVar()


既然知道了这个原因,咱们再修改程序之前,先来测试一下:

(这个时候应该打开IDLE了!)

<code>>>> from tkinter import *
>>> win = Tk()

>>> sv = StringVar()
>>> sv.get()
''
>>> sv.set("你好,神秘的TKinter!")
>>> sv.get()
'你好,神秘的TKinter!'
>>> sv.set("%s --- 快乐编程,快乐成长!" % sv.get())
>>> sv.get()
'你好,神秘的TKinter! --- 快乐编程,快乐成长!'
>>>/<code>

看来,通过这种方式是可以实现更新Tkinter中变量的目的的!

让我们修改一下最初的程序

<code>import tkinter as tk

class Window(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Hello")
        self.label_text = tk.StringVar()
        self.label_text.set('choose')


        self.label = tk.Label(self, textvariable=self.label_text)
        self.label.pack(fill=tk.BOTH, expand=1, padx=100, pady=30)


        hello_button = tk.Button(self, text="Say Hello", command=self.say_hello)
        hello_button.pack(side=tk.LEFT, padx=(20, 0), pady=(0, 20))


        goodbye_button = tk.Button(self, text="Say GoodBye", command=self.say_goodbye)
        goodbye_button.pack(side=tk.RIGHT, padx=(0, 20), pady=(0, 20))


    def say_hello(self):
        self.label_text.set('welcome')


    def say_goodbye(self):
        self.label_text.set('Goodbye! \\n (Closing in 2 seconds)')

        self.after(2000, self.destroy)


if __name__ == "__main__":
    window = Window()
    window.mainloop()
/<code>

通过在初始化方法__init__()中定义,并给到一个初始化值

<code>self.label_text = tk.StringVar()
self.label_text.set('choose')/<code>

然后在按钮点击函数中,分别赋予新的值,这个时候就可以看到对应的label显示的文本发生了变化。

搞定!


在这个代码里,大家需要注意一点。我们在设置变量和控件绑定的时候,使用的是textvariable=self.label_text这个参数,而不是之前的text。


好了,今天的知识点,大家掌握了吗?



咱们下节课再继续学习Tkinter的知识吧。

快乐编程,快乐成长!


分享到:


相關文章: