原文链接:Python 图形化界面设计(Tkinter) - 简书 (jianshu.com)
子窗体(Toplevel)
直接上代码:
# 子窗体
from tkinter import *
def newwindow():
winNew = Toplevel(root)
winNew.geometry('320x240')
winNew.title('子窗口')
zlab = Label(winNew, text='这是一个子窗口')
zlab.place(relx=0.2, rely=0.2)
close = Button(winNew, text='关闭', command=winNew.destroy)
close.place(relx=0.7, rely=0.5)
root = Tk()
root.title('主窗口')
root.geometry('320x240')
lab = Label(root, text='这是一个主窗口', font=('黑体', 20, 'bold'))
lab.place(relx=0.2, rely=0.2)
mainmenu = Menu(root)
menuFile = Menu(mainmenu, tearoff=0)
mainmenu.add_cascade(label='菜单', menu=menuFile)
menuFile.add_command(label='新窗体', command=newwindow)
menuFile.add_separator()
menuFile.add_command(label='退出', command=root.destroy)
root.config(menu=mainmenu)
root.mainloop()
输出结果:
模式对话框,
1,消息对话框
代码示例:
# 消息对话框
from tkinter import *
import tkinter.messagebox
def xx():
answer = tkinter.messagebox.askokcancel('请选择', '请选择确定或取消')
if answer:
lab.config(text='已确认', fg='green')
else:
lab.config(text='已取消', fg='red')
root = Tk()
root.title('消息对话框')
root.geometry('300x100')
lab = Label(root, text='')
lab.pack()
btn = Button(root, text='弹出对话框', fg='blue', command=xx)
btn.pack()
root.mainloop()
输出结果:
2,输入对话框
代码示例:
# 输入对话框
from tkinter.simpledialog import *
from tkinter import *
def sr():
q = askstring('请输入', '请输入一段文字')
lab.config(text=q)
root = Tk()
root.title('输入对话框')
root.geometry('320x240')
lab = Label(root, text='')
lab.pack()
btn = Button(root, text='输入', fg='blue', command=sr)
btn.place(relx=0.5, rely=0.5, anchor=CENTER)
root.mainloop()
输出结果:
,
3,文件选择对话框
代码示例:
# 文件选择对话框
from tkinter import *
import tkinter.filedialog
def wjxz():
filename = tkinter.filedialog.askopenfilename() # 返回文件路径
print(filename)
if filename != '':
# 打开文件并读取内容
try:
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
lab.config(text='你选的文件是:' + filename + '\n文件内容:\n' + content)
except Exception as e:
lab.config(text='打开文件时出错:' + str(e))
else:
lab.config(text='未选择文件')
root = Tk()
root.title('文件选择对话框')
root.geometry('700x800') # 增加了窗口的高度以容纳更多文本
lab = Label(root, text='')
lab.pack(pady=20) # 增加垂直内边距,使标签与按钮之间的空间更大
btn = Button(root, text='选择文件', fg='blue', command=wjxz)
btn.place(relx=0.01, rely=0.01)
root.mainloop()
输出结果:
4,颜色选择对话框
代码示例:
# 颜色选择对话框
from tkinter import *
import tkinter.colorchooser
def ys():
color = tkinter.colorchooser.askcolor()
colorstr = str(color)
print('打印字符串%s 切掉后=%s' % (colorstr, colorstr[-9:-2]))
lab.config(text=colorstr[-9:-2], bg=colorstr[-9:-2])
root = Tk()
root.title('颜色选择对话框')
root.geometry('300x200')
lab = Label(root, text='请关注颜色的变化', bg='white')
lab.pack()
btn = Button(root, text='选择颜色', fg='blue', command=ys)
btn.place(relx=0.01, rely=0.01)
root.mainloop()
输出结果:
事件响应
示例,按键响应
代码示例:
# 按键响应
from tkinter import *
def show(event):
s = event.keysym
lab.config(text=s)
root = Tk()
root.title('按键响应')
root.geometry('300x200')
lab = Label(root, text='请点击键盘', font=('楷体', 30))
lab.bind('<Key>', show)
lab.focus_set() # 使标签获取焦点
lab.pack()
root.mainloop()
输出结果:
事件响应一些基本绑定
1. 点击事件 (<Button-1>
)
通常用于绑定鼠标左键点击事件。
代码例子:
button = Button(root, text="Click Me!") | |
button.bind("<Button-1>", on_click) # 绑定鼠标左键点击事件 | |
def on_click(event): | |
print("Button clicked!") |
2. 键盘事件 (<Key>
, <Any-KeyPress>
, <KeyRelease>
, 等)
用于监听键盘上的按键事件。
代码例子:
entry = Entry(root) | |
entry.bind("<Key>", on_key_press) # 监听任意键的按下 | |
def on_key_press(event): | |
print("Key pressed:", event.char) |
3. 鼠标移动事件 (<Enter>
, <Leave>
, <Motion>
, 等)
用于监听鼠标在部件上的移动或进出事件。
代码例子:
label = Label(root, text="Hover over me") | |
label.bind("<Enter>", on_enter) | |
label.bind("<Leave>", on_leave) | |
def on_enter(event): | |
print("Mouse entered the label") | |
def on_leave(event): | |
print("Mouse left the label") |
4. 双击事件 (<Double-Button-1>
)
用于绑定鼠标左键的双击事件。
代码例子:
label = Label(root, text="Double-click me") | |
label.bind("<Double-Button-1>", on_double_click) | |
def on_double_click(event): | |
print("Label double-clicked!") |
5. 滚动事件 (<MouseWheel>
)
用于监听鼠标滚轮事件。
代码例子:
scrollbar = Scrollbar(root) | |
scrollbar.bind("<MouseWheel>", on_scroll) | |
def on_scroll(event): | |
print("Mouse wheel scrolled:", event.delta) |
6. 焦点变化事件 (<FocusIn>
, <FocusOut>
)
用于监听部件获取或失去焦点的事件。
代码例子:
entry = Entry(root) | |
entry.bind("<FocusIn>", on_focus_in) | |
entry.bind("<FocusOut>", on_focus_out) | |
def on_focus_in(event): | |
print("Entry got focus") | |
def on_focus_out(event): | |
print("Entry lost focus") |
7. 窗口大小改变事件 (<Configure>
)
用于监听窗口大小变化的事件。
代码例子:
root.bind("<Configure>", on_resize) | |
def on_resize(event): | |
print("Window resized to:", event.width, "x", event.height) |
8. 鼠标拖动事件 (<B1-Motion>
, <ButtonPress-1>
, <ButtonRelease-1>
, 等)
这些事件允许你监听和处理鼠标拖动操作。
代码例子:
canvas = Canvas(root, width=200, height=200) | |
canvas.bind("<B1-Motion>", on_drag) | |
canvas.pack() | |
def on_drag(event): | |
print("Dragging at:", event.x, event.y) |
9. 部件销毁事件 (<Destroy>
)
当部件被销毁时触发。
代码例子:
frame = Frame(root) | |
frame.bind("<Destroy>", on_destroy) | |
frame.pack() | |
def on_destroy(event): | |
print("Frame destroyed") |
10. 部件映射事件 (<Map>
, <Unmap>
)
当部件被映射到屏幕上(变得可见)或被从屏幕上移除(变得不可见)时触发。
代码例子:
label = Label(root, text="Hello") | |
label.bind("<Map>", on_map) | |
label.bind("<Unmap>", on_unmap) | |
label.pack() | |
def on_map(event): | |
print("Label mapped") | |
def on_unmap(event): | |
print("Label unmapped") |
11. 菜单项选择事件 (<<Command>>
)
当用户选择菜单项时触发。
代码例子:
menu = Menu(root) | |
menu.add_command(label="Quit", command=quit_program) | |
menu.bind("<<Command>>", on_menu_command) | |
def quit_program(): | |
root.quit() | |
def on_menu_command(event): | |
print("Menu command selected:", event.widget.cget("label")) |
12. 定时器事件 (root.after()
)
虽然这不是一个绑定到部件的事件,但Tkinter的after()
方法允许你设置一个定时器,在指定的时间后调用一个函数。这可以用于实现周期性的事件或延迟执行某些操作。代码例子:
def update_clock(): | |
current_time = time.strftime("%H:%M:%S") | |
clock_label.config(text=current_time) | |
root.after(1000, update_clock) # 每秒更新一次时钟 | |
clock_label = Label(root, font=('helvetica', 36, 'bold'), bg='green') | |
clock_label.pack(fill=BOTH, expand=YES) | |
update_clock() # 开始更新时钟 |
在使用这些事件时,你通常需要定义一个回调函数(如上面的 on_click
),它接收一个事件对象作为参数。这个事件对象包含了关于触发事件的详细信息,如按键的字符、鼠标的位置、滚动的距离等。通过访问这些属性,你可以在回调函数中执行相应的操作。