目录
看B站莫烦python教学
可以直接用的高清窗口
import tkinter as tk
import ctypes
#创建窗口,root可替换成自己定义的窗口
window=tk.Tk()
window.title('窗口名')
window.geometry('400x400')
#调用api设置成由应用程序缩放
ctypes.windll.shcore.SetProcessDpiAwareness(1)
#调用api获得当前的缩放因子
ScaleFactor = ctypes.windll.shcore.GetScaleFactorForDevice(0)
#设置缩放因子
window.tk.call('tk', 'scaling', ScaleFactor/75)
tk.Label(text='这是一个可以直接用的高清窗口').pack()
window.mainloop()
hit_me事件
import tkinter as tk
window = tk.Tk()
window.title('sql2xlsx') # 窗口名
window.geometry('200x100') # 长*宽
var = tk.StringVar() # tk形式的字符串变量
# label1 = tk.Label(window, text='这是txt,背景是粉色', bg='pink', font=('Simsum', 12), width=15, height=2) # window上的label
label1 = tk.Label(window, textvariable=var, bg='pink', font=('Simsum', 12), width=15, height=2) # window上的label
label1.pack() # 把label放在窗口上
on_hit = False
# hit me事件
def hit_me():
global on_hit # 全局变量
if not on_hit:
on_hit = True
var.set('you hit me') # 改变变量
else:
on_hit = False
var.set('hidden')
b = tk.Button(window, text='按钮的文字', bg='#66bb6a', width=15, height=2, command=hit_me) # command绑定事件(函数)
b.pack()
window.mainloop() # 窗口循环刷新
text
import tkinter as tk
import tkinter.font as tf
window = tk.Tk()
window.title('sql2xlsx') # 窗口名
window.geometry('200x100') # 长*宽
ft = tf.Font(family='微软雅黑', size=10) # 字体
e = tk.Entry(window, show='*') # show,密码的显示为*
e.pack()
def insert_point():
var = e.get()
t.insert('insert', var)
def insert_end():
var = e.get()
t.insert('end', var)
# t.insert('1.1', var) # 1.1在第一行的第一列插入
b1 = tk.Button(window, text='将文本插入点前', bg='#66bb6a', font=ft, width=13, height=1, command=insert_point) # command绑定事件(函数)
b1.pack()
b2 = tk.Button(window, text='将文本插入末尾', font=ft, width=13, height=1, command=insert_end)
b2.pack()
t = tk.Text(window, height=5, width=20)
t.pack()
window.mainloop() # 窗口循环刷新
选项
import tkinter as tk
import tkinter.font as tf
window = tk.Tk()
window.title('sql2xlsx') # 窗口名
window.geometry('200x100') # 长*宽
ft = tf.Font(family='微软雅黑', size=10)
e = tk.Entry(window, show='*') # show,密码的显示为*
e.pack()
var1 = tk.StringVar()
label1 = tk.Label(window, bg='yellow', width=6, textvariable=var1)
label1.pack()
def print_selection():
value = lb.get(lb.curselection()) # 获取选定的选项
var1.set(value)
b1 = tk.Button(window, text='打印选择的部分', bg='#66bb6a', font=ft, width=13, height=1, command=print_selection) # command绑定事件(函数)
b1.pack()
var2 = tk.StringVar()
var2.set(('选项1', '选项2', '选项1', '选项3', '选项4'))
lb = tk.Listbox(window, listvariable=var2) # 制定选项
list_items = [1,2,3,4]
for item in list_items:
lb.insert('end', item) # 在制定好选项后,在末尾依次插入1,2,3,4选项
lb.insert(1, 'first') # 在原本的选项中的索引1插入'first'选项
lb.insert(2, 'second') # 在原本的选项中的索引2插入'first'选项
lb.delete(2) # 删除索引为2的讯息
lb.pack()
window.mainloop() # 窗口循环刷新
勾选选项 只能选一个
import tkinter as tk
window = tk.Tk()
window.title('窗口名')
window.geometry('200x200')
var = tk.StringVar()
label = tk.Label(window, bg='pink', width=16)
label.pack()
def print_selection():
label.config(text='你选择了选项' + var.get()) # 改变label的参数
r1 = tk.Radiobutton(window, text='选项A', variable=var, value='A', command=print_selection)
r1.pack()
r2 = tk.Radiobutton(window, text='选项B', variable=var, value='B', command=print_selection)
r2.pack()
r3 = tk.Radiobutton(window, text='选项C', variable=var, value='C', command=print_selection)
r3.pack()
window.mainloop()
勾选选项 能选多个
import tkinter as tk
window = tk.Tk()
window.title('窗口名称')
window.geometry('200x200')
l = tk.Label(window, bg='yellow', width=20, text='空的')
l.pack()
def print_selection():
if var1.get() and var2.get(): # 如果var1和var2都存在
l.config(text='我选择了python和C++') # + var1.get() + var2.get())
elif var1.get():
l.config(text='我选择了Python') # + var1.get())
elif var2.get():
l.config(text='我选择了C++') # + var2.get())
else:
l.config(text='我都不选')
var1 = tk.IntVar()
var2 = tk.IntVar()
c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0, command=print_selection) # onvalue:选定时赋值为1, offvalue:不选定时赋值为0
c2 = tk.Checkbutton(window, text='C++', variable=var2, onvalue=1, offvalue=0, command=print_selection)
c1.pack()
c2.pack()
window.mainloop()
窗口布局
import tkinter as tk
window = tk.Tk()
window.title('我的窗口')
window.geometry('200x200')
tk.Label(window, text='一个标签').pack()
frm = tk.Frame(window)
frm.pack()
frm_l = tk.Frame(frm,)
frm_r = tk.Frame(frm)
frm_l.pack(side='left')
frm_r.pack(side='right')
tk.Label(frm_l, text='标签2').pack()
tk.Label(frm_l, text='标签3').pack()
tk.Label(frm_r, text='标签4').pack()
window.mainloop()
消息弹窗
import tkinter as tk
import tkinter.messagebox
window = tk.Tk()
window.title('标题')
window.geometry('400x400')
def hit_me():
tk.messagebox.showinfo(title='Hi', message='信息') # 信息弹窗
tk.messagebox.showerror(title='Hi', message='警告') # 不能这么做
tk.messagebox.showerror(title='Hi', message='报错')
print(tk.messagebox.askquestion(title='问题', message='问题描述')) # 选择,返回yes或no
print(tk.messagebox.askyesnocancel(title='问题', message='是否要这么做')) # 返回True或False或None
# tk.messagebox.askretrycancel
tk.Button(window, text='hit me', command=hit_me).pack()
window.mainloop()
布局
import tkinter as tk
#导入库
import ctypes
from tkinter import *
from tkinter.ttk import *
#创建窗口,root可替换成自己定义的窗口
window=Tk()
window.title('窗口名')
window.geometry('400x400')
#调用api设置成由应用程序缩放
ctypes.windll.shcore.SetProcessDpiAwareness(1)
#调用api获得当前的缩放因子
ScaleFactor=ctypes.windll.shcore.GetScaleFactorForDevice(0)
#设置缩放因子
window.tk.call('tk', 'scaling', ScaleFactor/75)
# 方式1:制定在哪个网格中
for i in range(4):
for j in range(3):
tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)
# 方式2:直接指定坐标
tk.Label(window, text=2).place(x=23, y=105, anchor='nw') # anchor='nw':左上角对准坐标
window.mainloop()
下拉选择文件路径
from tkinter import *
from tkinter.filedialog import askdirectory
def selectPath():
path_ = askdirectory() # 参数initialdir=为初始打开路径
path.set(path_)
root = Tk()
path = StringVar()
Label(root,text = "目标路径:").grid(row = 0, column = 0)
Entry(root, textvariable = path).grid(row = 0, column = 1)
Button(root, text = "路径选择", command = selectPath).grid(row = 0, column = 2)
root.mainloop()
样式设计
参考文献:[python] tkinter简介以及各类属性参数总结
更改窗口图标
window.iconbitmap('image/favicon.ico') # 添加图标
按钮的图标
pic1 = tk.PhotoImage(file='image/无标题.png') # 文件夹图标
tk.Button(window, image=pic1, command=selectPath).place(x=1090, y=50)
字体的像素高度
像素高度=(8+字体大小*4/3)取整
文本框和文本框地下按钮的相对位置
# 滚动文本框
scrolW = 40 # 设置文本框的长度
scrolH = 25 # 设置文本框的高度
scr = scrolledtext.ScrolledText(window, width=scrolW, height=scrolH, wrap=tk.WORD) # wrap=tk.WORD 这个值表示在行的末尾如果有一个单词跨行,会将该单词放到下一行显示,比如输入hello,he在第一行的行尾,llo在第二行的行首, 这时如果wrap=tk.WORD,则表示会将 hello 这个单词挪到下一行行首显示, wrap默认的值为tk.CHAR
scr.place(x=x_sql+5, y=y_sql+40) # grid(column=0, columnspan=3) # columnspan 个人理解是将3列合并成一列 也可以通过 sticky=tk.W 来控制该文本框的对齐方式
ttk.Button(window, text='清空并粘贴').place(x=x_sql+5, y=int(8+font_size*4/3)*scrolH*1.65) # 绑定事件函数
y=int(8+font_size*4/3)*scrolH*1.65
,其 font_size是字体大小,效果图如下:按钮会永远在文本框下面
ttk.Checkbutton 设置为默认未选中
参考文献:https://cloud.tencent.com/developer/ask/sof/294337
c1 = ttk.Checkbutton(window, text='导出为csv', variable='csv', onvalue=1, offvalue=0) # onvalue:选定时赋值为1, offvalue:不选定时赋值为0
c2 = ttk.Checkbutton(window, text='导出为xlsx', variable='excel', onvalue=1, offvalue=0) # onvalue:选定时赋值为1, offvalue:不选定时赋值为0
c1.place()
c2.place()
c1.state(['!alternate']); c2.state(['!alternate']) # 设置为未勾选
c2.state(['selected']) # 设置为勾选
指针形状
tk和ttk都适用
参考文献:https://blog.csdn.net/weixin_52132159/article/details/117911619
参数cursor='hand2'
粘贴文本
# 事件:清空并粘贴
def clear_and_paste():
t.delete('1.0', "end") # 清空文本
t.event_generate('<<Paste>>') # 粘贴文本
滚动滑条
参考文献:https://www.cnblogs.com/anita-harbour/p/9315438.html
https://blog.csdn.net/lavender_dream/article/details/109928188
scrolW = 40 # 设置文本框的长度
scrolH = 20 # 设置文本框的高度
scr = scrolledtext.ScrolledText(window, width=scrolW, height=scrolH, wrap='none') # wrap=tk.WORD 这个值表示在行的末尾如果有一个单词跨行,会将该单词放到下一行显示,比如输入hello,he在第一行的行尾,llo在第二行的行首, 这时如果wrap=tk.WORD,则表示会将 hello 这个单词挪到下一行行首显示, wrap默认的值为tk.CHAR
scr.place(x=x_sql+5, y=y_sql+40) # grid(column=0, columnspan=3) # columnspan 个人理解是将3列合并成一列 也可以通过 sticky=tk.W 来控制该文本框的对齐方式
# 测试水平滚动条
scrollBarh = tk.Scrollbar(window, orient='horizontal') # 创建滚动条
scrollBarh.pack(side='bottom', fill=tk.X) # 靠下,充满x轴
scrollBarh.config(command=scr.xview) # 和text的框绑定