导航

GPT的tkinter学习之路(2)

Posted on 2024-07-13 22:01  AusarPu  阅读(4)  评论(0编辑  收藏  举报

2024/7/13

Task1:事件处理

import tkinter as tk

# 创建主窗口
root = tk.Tk()
root.title("Tkinter 事件处理示例")
root.geometry("300x200")

# 创建一个标签来显示按键信息
label = tk.Label(root, text="Press any key")
label.pack(pady=20)

# 按键事件处理函数
def on_key_press(event):
    label.config(text=f"Key pressed: {event.keysym}")

# 将按键事件绑定到主窗口
root.bind("<KeyPress>", on_key_press)

# 运行主事件循环
root.mainloop()

预期效果:

  • 每按下一个key,就在控制台输出

Attention:

  • 利用了前文提到的label.config()来实现动态变化
  • 关于bind()方法,可以绑定到窗口,标签,输入框等等,当被绑定的元素获得焦点 (正在使用) 的时候,就会触发对应的事件
  • bind方法的参数需要两个
    1. 事件描述符:一个字符串,描述你要绑定的事件。例如,"" 表示鼠标左键点击事件。
    2. 事件处理函数:一个函数,当事件发生时会被调用。这个函数会自动接收一个 event 对象作为参数。
  • bind支持的事件如下表,参见
事件 简介
<Button-detail> 鼠标按键的单击事件,detail 指定哪个鼠标键被单击。例如单击鼠标左键为 <Button-1>,单击鼠标中键为 <Button-2>,单击鼠标右键为 <Button-3>,单击向上滚动的滚轮为 <Button-4>,单击向下滚动的滚轮为 <Button-5>
<modifier Motion> 鼠标在组件上的移动事件,modifier 指定要求按住的鼠标键。例如按住鼠标左键移动为 <B1-Motion>,锁住鼠标杯中键移动为 <B2-Motion>,按住鼠标右键移动为 <B3-Motion>
<ButtonRelease-detail> 鼠标按键的释放事件,detail 指定哪个鼠标按键释放。例如鼠标左键被释放为 <ButtonRelease-1>,鼠标中键被释放为 <ButtonRelease-2>,鼠标右键被释放为 <ButtonRelease-3>
<Double-Button-detail><Double-detail> 用户双击某个鼠标键的事件,detail 指定哪个鼠标键被双击。例如双击鼠标左键为 <Double-1>,双击鼠标中键为 <Double-2>,双击鼠标右键为 <Double-3>,双击向上滚动的滚轮为 <Double-4>,双击向下滚动的滚轮为 <Double-5>
<Enter> 鼠标进入组件的事件。注意,<Enter> 事件不是按下回车键事件,按下回车键的事件是 <Return>
<Leave> 鼠标移出组件事件
<FocusIn> 组件及其包含的子组件获得焦点
<FocusOut> 组件及其包含的子组件失去焦点
<Return> 按下回车键的事件。实际上可以为所有按键绑定事件处理方法。特殊按键位名称包括 Cancel,BackSpace,Tab,Return(回车),Shift_L(左 Shift,如果只写 Shift 则代表两者),Control_L(左 Ctrl,如果只写 Control 则代表两者 Ctrl),Alt_L(左 Alt,如果只写 Alt 则代表左 Alt),Pause,Caps_Lock,Escape,Prior(Page Up),Next(Page Down),End,Home,Left,Up,Right,Down,Print,Insert,Delete,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,Num_Lock 和 Scroll_Lock
<Key> 键盘上任意键的单击事件,程序可以通过 event 获取用户单击了哪个键
a 组件上指定键被单击的事件。例如 'a' 代表 a 键被单击,'b' 代表 b 键被单击(不要尖括号)
<Shift-Up> 在 Shift 键被按下时按 Up 键。类似的还有 <Shift-Left><Shift-Down><Alt-Up><Control-Up>
<Configure> 组件大小、位置改变的事件。例如改变了组件的大小、位置需要重新配置组件的宽度,height、x、y 获取
  • event具有的属性如下表,来源于 GPT
方法/属性 简介
event.keysym 返回按下的键的符号名称。例如,按下'a'键时返回'a',按下Shift键时返回'Shift'。
event.char 返回按下的键的字符。例如,按下'a'键时返回'a',按下Shift键时返回一个空字符串。
event.keycode 返回按下的键的键码。例如,按下'a'键时返回65,按下Shift键时返回16。
event.x 返回鼠标事件发生时鼠标指针的x坐标(相对于窗口)。
event.y 返回鼠标事件发生时鼠标指针的y坐标(相对于窗口)。
event.x_root 返回鼠标事件发生时鼠标指针的x坐标(相对于屏幕)。
event.y_root 返回鼠标事件发生时鼠标指针的y坐标(相对于屏幕)。
event.type 返回事件类型。例如,按下键盘按键时返回'2',释放按键时返回'3',鼠标按键点击时返回'4'。
event.widget 返回触发事件的组件。例如,一个按钮被点击时,返回该按钮的引用。
event.state 返回事件状态的修饰符。例如,Shift键被按下时返回'1',Control键被按下时返回'4'。
event.time 返回事件发生的时间(自程序启动以来的毫秒数)。
event.num 返回鼠标按键编号。例如,鼠标左键点击时返回1,中键点击时返回2,右键点击时返回3。
event.delta 返回鼠标滚轮的滚动量。在Windows上,向前滚动返回120,向后滚动返回-120。
event.height 返回组件被调整大小时的新高度(仅适用于事件)。
event.width 返回组件被调整大小时的新宽度(仅适用于事件)。
event.xdata 返回事件的x数据,仅适用于一些特殊事件,如虚拟事件()。
event.ydata 返回事件的y数据,仅适用于一些特殊事件,如虚拟事件()。
event.serial 返回事件序列号,这是一个唯一的标识符,用于区分事件。
event.num 对于鼠标事件,返回鼠标按钮的编号。例如,1表示左键,2表示中键,3表示右键。

Task2:使用更多的 Tkinter 组件

import tkinter as tk

# 创建主窗口
root = tk.Tk()
root.title("Tkinter 组件示例")
root.geometry("400x300")

# 创建一个复选按钮
check_var = tk.BooleanVar()
checkbutton = tk.Checkbutton(root, text="Check me", variable=check_var)
checkbutton.pack(pady=10)

# 创建单选按钮
radio_var = tk.StringVar(value="Option1")
radiobutton1 = tk.Radiobutton(root, text="Option 1", variable=radio_var, value="Option1")
radiobutton2 = tk.Radiobutton(root, text="Option 2", variable=radio_var, value="Option2")
radiobutton1.pack(pady=5)
radiobutton2.pack(pady=5)

# 创建一个列表框
listbox = tk.Listbox(root)
listbox.insert(1, "Item 1")
listbox.insert(2, "Item 2")
listbox.insert(3, "Item 3")
listbox.pack(pady=10)

# 创建一个滑动条
scale = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL)
scale.pack(pady=10)

# 按钮点击事件的处理函数
def on_button_click():
    print("Checkbox state:", check_var.get())
    print("Selected radio button:", radio_var.get())
    print("Selected listbox item:", listbox.get(tk.ACTIVE))
    print("Scale value:", scale.get())

# 创建一个按钮
button = tk.Button(root, text="Print Values", command=on_button_click)
button.pack(pady=10)

# 运行主事件循环
root.mainloop()

预期效果:

  • 创建复选按钮x1(选或者不选)
  • 单选按钮x2(选哪个)
  • 3个选项的列表框
  • 滑动条x1(横向)

Attention:

  • 创建按钮之前要先建立按钮的变量值 (使用tk库函数来进行初始化),按钮的variable属性可以传递变量值
  • 初始化不同的值可以使得按钮默认被选中或不选
  • 滑动条默认是竖向的,将orient属性设置为HORIZONTAL可以改变为横向