Python GUI Cookbook —— 数据与类

将数据保存到 tkinter 变量中

如何使用 StringVar()

tkinter 内置的类型与 Python 中的类型有点不一样

类型 解释
strVar = StringVar() 字符串
intVar = IntVar() 整数
dbVar = DoubleVar() 浮点数
blVar = BooleanVar() 布尔类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tkinter as tk


# Create instance of tkinter
window = tk.Tk()

# Create DoubleVar
doubleData = tk.DoubleVar()
print(doubleData.get())
doubleData.set(2.4)
print(type(doubleData))

add_doubles = 1.22222222222222222222 + doubleData.get()
print(add_doubles)
print(type(add_doubles))

1
2
3
4
5
6
7
8
9
10
[...]
# Assign tkinter Variable to strData varible
strData = tk.StringVar()
# Set strData variable
strData.set('Hello StringVar')
# Get value of strData variable
varData = strData.get()
# Print out current value of strData
print(varData)

1
2
3
print(tk.IntVar())
print(tk.DoubleVar())
print(tk.BooleanVar())

如何从 widget 中获取数据

当用户输入一些数据时,我们需要对这些数据进行一些操作。可以使用 get() 方法在 widget 上获取数据。

使用模块级别的全局变量

对于任何语言来说,封装都是一种优势,它能让我们使用面向对象编程。Python 即能面向对象又能面向过程。我们创建全局变量仅在模块内有效。为什么需要这个呢?因为,随着向 GUI 中添加的功能越来越多,我们希望避免可能命名冲突。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
GLOBAL_CONST = 42

def usingGlobal0():
print(GLOBAL_CONST)

def usingGlobal1():
GLOBAL_CONST = 233
print(GLOBAL_CONST)

def usingGlobal2():
global GLOBAL_CONST
print(GLOBAL_CONST)
GLOBAL_CONST = 233
print(GLOBAL_CONST)

print(GLOBAL_CONST)
print('-'*16)

usingGlobal0()
print('-'*16)

usingGlobal1()
print('-'*16)

usingGlobal2()
print('-'*16)


使用类提升 GUI

使用类为我们的代码提供了灵活性

将之前的代码变成一个类。缩进所有现有的代码,在变量前加 self

回调函数

起初,回调函数似乎有点吓人。你调用这个函数,传递一些参数,然后这个函数告诉你它真的很忙,它会 call you back!

你不禁会想:这个函数会不会 call me back?我还要等多久?在 Python 中,即使是回调函数也很容易实现,是的,它们通常会 call you back。只需先完成分配的任务。

让我们多了解一下将回调函数编码到 GUI 中会发生什么。

GUI 是事件驱动的。在屏幕上创建并显示之后,它通常在那里等待事件发生。一般是等待事件发送给它。我们可以通过点击动作按钮来发送一个事件给 GUI。这创造了一个事件,
从某种意义上说,我们通过发送消息来调用 GUI。

我们向 GUI 发送消息之后会发生什么?单击按钮后会发生什么事取决于我们是否创建了事件处理程序并将其与此按钮关联。如果我们没有创建事件处理程序,单击该按钮将不起作用。
事件处理程序是一个回调函数(如果我们使用类的话,则是一个方法)。回调方法也,像 GUI 一样,被动地待在那里,等待被调用。一旦 GUI 获取了按钮点击,它将调用回调。

回调通常会进行一些处理,完成后会将结果返回给 GUI。

创建可重用 GUI 组件

使用 DRY(Don’t Repeat Yourself,不要重复自己)原则,而不是复制/粘贴/修改,通用代码仅放在一个地方,这样当我们修改代码时,所有导入它的模块都会自动获取最新版代码。

参考文献

  • Python GUI Programming Cookbook - Second Edition by Burkhard A. Meier