0
点赞
收藏
分享

微信扫一扫

tkinter学习笔记

月孛星君 2022-01-16 阅读 63

目录

看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的框绑定
举报

相关推荐

0 条评论