文章目录
Tkinter 中的数据类型
经过前面三章的学习,相信大家要看懂下面的代码已经不是难事。如果没有看过前面的章节,建议大家翻看Python GUI:Tkinter——03
下面这些代码将演示如何使用 Tkinter 的数据类型。不得不说的是,前面的开发中,我们只是开发了一个空壳子。数据之间是如何传递的,我们尚未搞明白。但多少知道一个道理:Python 通过 tkinter 模块来访问 Tkinter,也即 API 的。因此,Tkinter 有自己的数据类型,我们在使用它是,要声明,就像 C 语言和 Java 那样。Python 则不然,它是动态类语言,因此不用声明,但运行速度慢。
似乎有一种语言(顺带一提)结合了动态类和静态类,它就是 Julia,据说不错,我没用过,也没看过(你懂的)
import tkinter as tk
win = tk.Tk()
strVar = tk.StringVar()
strVar.set('Hello Zhuo muniao')
str_py = strVar.get()
print(str_py) #输出 Hello Zhuo muniao
"""让我们看看各个 tkinter 变量的初始值吧"""
print(tk.IntVar()) #PY_VAR52
print(tk.DoubleVar()) #PY_VAR53
print(tk.BooleanVar()) #PY_VAR54
""" PY_VAR52,证明没有值!!是这样吗,请继续往下看"""
print(tk.IntVar().get()) #0
print(tk.DoubleVar().get()) #0.0
print(tk.BooleanVar().get()) #False
顺带一提,在声明了 tkinter 变量后,可以在看到:
如何获取控件的输入呢?
一个带有控件的输入一般可以分为:
- 字符串输入
- 数值输入
前者有 Entry、Scrolledtext;后者有 Combobox、Spinbox 等。当然,他们本质上都是字符串输入。哈哈,皮了一下。也就是说,他们都能够赋值给 StringVar 变量。然而,不需要多次一举。
比如在我们的定义的 Entry 、Combobx 控件中,我们曾经是这样定义的:
......
etyVar = tk.StringVar()
aEntry = ttk.Entry(zhuo,textvariable=etyVar)
aEntry.grid(column=0,row=1)
comVar = tk.StringVar()
aCombobox = ttk.Combobox(zhuo,textvariable=comVar,state='readonly')
aCombobox['value'] = (1,2,4,8)
aCombobox.grid(column=1,row=1)
def clickBut():
aButton.configure(text='hello'+etyVar.get()+comVar.get())
mBox.showerror('错误提示框','你没有错,是我错了')
aButton = ttk.Button(zhuo,text='click me',command=clickBut)
aButton.grid(column=2,row=1)
......
然后,在 clickBut 激活函数中,我们用 etyVar 和 comVar 来获取控件的输入。但这没必要,只需要用 控件的 .get()
接口就行了。我们修改 clickBut 函数:
......
def clickBut():
aButton.configure(text='hello'+aEntry.get()+aCombobox.get())
mBox.showerror('错误提示框','你没有错,是我错了')
......
然后发现功能还是一样的。实际上,所有的控件,无论它什么类型,都能用 .get()
接口来获取其输入。
OOP
为什么要面向对象?
- 首先可以封装,封装的一大好处是,给变量弄静态类。如上一节所述,能够避免命名变量的麻烦
- 其二,每个控件的 callback 函数可以随便放,而不需要一定放在前面(也即打破了声明)
- 其三,多文件编程。在第二章中,我们做了一个伟大的、但失败了的尝试,然而 OOP 做到了。
Tkinter 的 GUI 是如何工作的
Tkinter 实现的 GUI ,或者说大部分的软件,他们都是以一个无限循环事件来工作的。所有代码都在循环执行。更确切地说,GUI 是静止的,直到用户发出某个事件时,才暗流涌动。比如,某个点击事件,会触发 GUI 程序的一系列响应。假若用户将 GUI 高高挂起,或者“走开”了一段时间,那么 GUI 就像洋娃娃一样一动不动。
OOP 开发
我们将上一章的代码改写为 OOP,如果没有阅读过上一章,点击Python GUI:Tkinter——03跳转
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox as mBox
from tkinter import Menu
from sys import exit
from tooltips import * #见上一章
from tkinter import scrolledtext
from tkinter import Spinbox
class OOP():
def __init__(self):
self.win = tk.Tk()
self.win.title('标题')
self.win.iconbitmap(r'../app.ico')
self._createWidget()
def _clickBut(self):
self.aButton.configure(text='hello'+self.aEntry.get()+self.aCombobox.get())
mBox.showerror('错误提示框','你没有错,是我错了')
def _quit(self):
self.win.quit()
self.win.destroy()
exit()
def _clickRad(self):
flag = self._radVar.get