1.checkbutton
1.1 使用方式
1)创建IntVar变量,用于存储checkbutton的状态0或是1,这个变量的值会根据复选框的选中状态自动更新,选中时是1,未选中是0.
checkbutton_var = tk.IntVar()
IntVar()输出的结果就是:
PY_VAR0 <class 'tkinter.IntVar'>
2)绑定变量
variable=checkbutton_var
3)点击时的回调函数,可以通过变量名.get(),或是变量名.set()来获取或是设置checkbutton的状态值。默认情况下选中时就是为1,未选中时就是为0.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/26 23:15
# @Author : George
import tkinter as tk
root = tk.Tk()
root.title("Checkbutton 示例")
def on_checkbutton_click():
print(globals()['checkbutton_var'].get()) # 从全局变量,获取状态值
print(checkbutton_var.get()) # 获取checkbutton的值,选中时为1,未选中时为0
if checkbutton_var.get():
print("Checkbutton 已选中")
else:
print("Checkbutton 未选中")
checkbutton_var = tk.IntVar() # 创建一个 IntVar 对象,用于存储 Checkbutton 的状态(0 或 1)
checkbutton = tk.Checkbutton(root,
text="选中我",
variable=checkbutton_var, # 绑定变量
command=on_checkbutton_click) # 点击时的回调函数
checkbutton.pack() # 将 Checkbutton 添加到主窗口
root.mainloop()
1.2 设置checkbutton二选一
给两个checkbutton全都绑定相同的setstate函数,并且传递不同的参数来区分不同的checkbutton。如果其中的一个checkbutton被选中,也就是num被传递为1时,将另外一个函数绑定的变量值设置为0时即可。也就是说我这个按钮被选中也就是绑定的变量值为1时,另外一个按钮绑定的变量值就设置直接设置为0
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/26 23:15
# @Author : George
import tkinter as tk
root = tk.Tk()
root.title("Checkbutton 示例")
def get_checkbutton_state():
nan = checkbutton_nan.get()
nv = checkbutton_nv.get()
print(nan,nv)
def set_checkbutton_state(num):
if num == 0:
checkbutton_nv.set(0)
if num == 1:
checkbutton_nan.set(0)
checkbutton_nan = tk.IntVar() # 创建一个 IntVar 对象,用于存储 Checkbutton 的状态(0 或 1)
checkbutton_1 = tk.Checkbutton(root,
text="男",
variable=checkbutton_nan, # 绑定变量
command=lambda: set_checkbutton_state(0)) # 点击时的回调函数
checkbutton_1.pack() # 将 Checkbutton 添加到主窗口
checkbutton_nv = tk.IntVar() # 创建一个 IntVar 对象,用于存储 Checkbutton 的状态(0 或 1)
checkbutton_2 = tk.Checkbutton(root,
text="女",
variable=checkbutton_nv, # 绑定变量
command=lambda: set_checkbutton_state(1)) # 点击时的回调函数
checkbutton_2.pack() # 将 Checkbutton 添加到主窗口
tk.Button(root, text="点击", command=get_checkbutton_state).pack()
root.mainloop()
1.3 解决冗余的checkbutton的定义和调用
如果要创建多个checkbutton,就需要定义多个Intvar(),此时可以使用字典来定义key_value.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/4/28 9:30
# @Author : George
from tkinter import *
class Test:
def __init__(self, master):
self.UI_list = {
"1.test": {"1.zs_test": "zs",
"2.ls_test": "ls",
"3.ww_test": "ww",
"4.zl_test": "zl"
}}
self.master = master
self.init_UI()
def init_UI(self):
self.master.title("test")
self.master.geometry("300x200")
self.y_num = 0 # 设置checkbutton的高度
self.var_dict = {} # 存储checkbutton变量的字典
for i, label in enumerate((self.UI_list["1.test"].keys())):
bootargs_label = label.split(".")[1]
Label(master=self.master, text=bootargs_label, width=12, anchor='w').place(relx=0.4, rely=self.y_num)
self.create_checkbutton(bootargs_label, 1)
self.create_checkbutton(bootargs_label, 2)
self.y_num = (float(0.95) / (float(len(self.UI_list["1.test"]) + 1))) * (1 + i)
Button(self.master, text='Get', width=11, height=1,
command=lambda: self.get_state()).place(
relx=0.05, rely=self.y_num)
def create_checkbutton(self, label, num):
var_name = "%s_state_%s" % (label, num)
self.var_dict[var_name] = IntVar()
checkbutton = Checkbutton(master=self.master, variable=self.var_dict[var_name],
text="-a" if num == 1 else "-r", command=lambda: self.set_check_state(label, num))
checkbutton.place(relx=0.05 + (num - 1) * 0.15, rely=self.y_num)
# checkbutton的-a.-r二选一
def set_check_state(self, label, num):
state1 = label + "_state_" + str(num)
if num == 1:
self.var_dict[label + "_state_" + str(2)].set(0)
if num == 2:
self.var_dict[label + "_state_" + str(1)].set(0)
def get_state(self):
state1 = []
state2 = []
for label in sorted(self.UI_list["1.test"].keys()):
label = label.split(".")[1]
state_1 = label + "_state_" + "1"
state_2 = label + "_state_" + "2"
state1.append(self.var_dict[state_1].get())
state2.append(self.var_dict[state_2].get())
print(state1)
print(state2)
if __name__ == '__main__':
root = Tk()
app = Test(root)
root.mainloop()
2.Radiobutton
2.1 使用方式
1)创建IntVar变量,用于存储Radiobutton根据传递的value来绑定的值
var = tk.IntVar()
IntVar()输出的结果就是:
PY_VAR0 <class 'tkinter.IntVar'>
2)绑定变量
variable=var
3)点击时的回调函数,可以通过变量名.get()获取的就是自己设置的value值
# _*_ coding utf-8 _*_
# george
# time: 2024/4/29上午10:59
# name: radiobutton_test.py
# comment:
import tkinter as tk
root = tk.Tk()
def on_option1_selected():
print(var)
print(var.get())
def on_option2_selected():
print(var.get())
var = tk.IntVar()
radio_button1 = tk.Radiobutton(root, text="Option 1", variable=var, value=3, command=on_option1_selected)
radio_button2 = tk.Radiobutton(root, text="Option 2", variable=var, value=4, command=on_option2_selected)
radio_button1.pack()
radio_button2.pack()
root.mainloop()
3.删除组件里面的子组件的内容
self.label_frame2.winfo_children()
获取的是包含子组件ID的列表,而不是子组件对象本身
for widget in self.label_frame2.winfo_children(): # 包含子组件ID的列表,而不是子组件对象本身
widget.destroy()
4.打开文件并返回文件的路径
askopenfilename()
是 Tkinter 的 tkFileDialog
模块(在较新的 Python 版本中,这已被 filedialog
模块所取代)中的一个函数,它用于弹出一个文件选择对话框,让用户可以选择一个文件。这个函数返回用户选择的文件的完整路径,如果用户取消了对话框,则返回空字符串。
def open_file(self):
self.fpath = askopenfilename()
if not self.fpath:
tkbox.showerror("Error", "file not selected")
self.file.set(self.fpath)
self.entry["fg"] = "black"