获取桌面文件夹绝对路径和文件的绝对路径
import tkinter as tk
from tkinter.filedialog import askdirectory, askopenfilename
root = tk.Tk()
root.withdraw()
file_path = askopenfilename() # askdirectory是获取文件夹路径
folder_path = askdirectory() # 获取文件夹路径
# python通过以下方式获取文件夹和文件的路径:
print(folder_path)
print(file_path)
按钮定位坐标
tk.Button(window, text="按钮", bg='white', width=15, height=1, command="center").place(x=420, y=45)
打开路径选择:
注意获得的路径 / 替换 // 采用replace( )函数替换
from tkinter import *
from tkinter.filedialog import askdirectory
import os
def selectPath():
path_ = askdirectory() #使用askdirectory()方法返回文件夹的路径
if path_ == "":
path.get() #当打开文件路径选择框后点击"取消" 输入框会清空路径,所以使用get()方法再获取一次路径
else:
path_ = path_.replace("/", "\\") # 实际在代码中执行的路径为“\“ 所以替换一下
path.set(path_)
def openPath():
dir = os.path.dirname(path.get()+"\\")
os.system('start ' + dir)
#print(dir)
root = Tk()
root.title("路径选择和文件位置打开功能演示")
path = StringVar()
path.set(os.path.abspath("."))
Label(root, text="目标路径:").grid(row=0, column=0)
Entry(root, textvariable=path,state="readonly").grid(row=0, column=1,ipadx=200)
# e.insert(0,os.path.abspath("."))
Button(root, text="路径选择", command=selectPath).grid(row=0, column=2)
Button(root, text="打开文件位置", command=openPath).grid(row=0, column=3)
root.mainloop()
2.2:tkinter的get( )和set( )方法
1.下面用set()实现,这里用了一个标记记录点击的状态,不管内容是什么点了就变
from tkinter import *
def btn_hit():
global msg_on
if msg_on == False:
msg_on=True
x.set("I like tkinter")
else:
msg_on = False
x.set("")
root = Tk()
root.title("tkinter的set()")
msg_on =False
x = StringVar()
lab = Label(root,textvariable=x,fg="blue",bg="lightyellow",font ="Verdana 16 bold",width=25,height=2)
lab.pack()
btn = Button(root,text="点我",command= btn_hit)
btn.pack()
root.mainloop()
2.下面用get先获取到内容,在判断,与上面的区别在于,上面没有获得内容直接变,下面对内容进行了判断
from tkinter import *
def btn_hit():
if x.get() == "":
x.set("I like tkinter")
else:
x.set("")
root = Tk()
root.title("tkinter的get()")
x = StringVar()
lab = Label(root,textvariable=x,fg="blue",bg="lightyellow",font ="Verdana 16 bold",width=25,height=2)
lab.pack()
btn = Button(root,text="点我",command= btn_hit)
btn.pack()
root.mainloop()
PIL制图库和Tkinter库报错type object ‘Image’ has no attribute ‘open’
1.原因:
因为第一行的from PIL import Image,与第二行tkinter import *冲突,tkinter中也含有Image类,所以你使用的是tkinter.Image。
2.修改:
把Image.open替换为PIL.Image.open,并将第一行的Image删除,因为与最后的import PIL.Image重复了。
3.建议:
在导入模块的时候,不建议import *的方式,因为很多模块没有用到,会导致命名冲突,所以应该是用到哪一个,导入哪一个。
3.弹框提示,各种样式:
3.1:单选框
tkinter.messagebox.showinfo('提示', '人生苦短') # 单选框 提示
tkinter.messagebox.showwarning('警告', '明天有雨') # 单选框 警告
tkinter.messagebox.showerror('错误', '出错了') # 单选框 出错了
3.2:多选框
a = tkinter.messagebox.askokcancel('提示', '要执行操作吗?')
b = tkinter.messagebox.askquestion('提示', '要执行操作吗?')
c = tkinter.messagebox.askretrycancel('提示', '重试还是取消?')
d = tkinter.messagebox.askyesnocancel('提示', '要执行操作吗?')
代码示例:
from tkinter import *
import tkinter.messagebox
import tkinter.filedialog
root = Tk()
# 单项提示框
def tips():
tkinter.messagebox.showinfo('提示', '人生苦短')
def warn():
tkinter.messagebox.showwarning('警告', '明天有雨')
def erro():
tkinter.messagebox.showerror('错误', '出错了')
root.title("不同按钮对应不同弹窗")
ti = Button(root, text="提示", command=tips, width=20, height=3)
wa = Button(root, text="警告", command=warn, width=20, height=3)
er = Button(root, text="错误", command=erro, width=20, height=3)
ti.pack()
wa.pack()
er.pack()
# 多选提示窗口
def but1():
a = tkinter.messagebox.askokcancel('提示', '要执行操作吗?')
print('返回的是True或者Flase:', a)
def but2():
b = tkinter.messagebox.askquestion('提示', '要执行操作吗?')
print('返回的是yes或者no:', b)
def but3():
c = tkinter.messagebox.askretrycancel('提示', '重试还是取消?')
print('返回的是True或者Flase:', c)
def but4():
d = tkinter.messagebox.askyesnocancel('提示', '要执行操作吗?')
print('返回的是true;no;none:', d)
'''
def but5():
e = tkinter.messagebox.askyesnoretry('提示','要执行操作吗?')
print('选项是yes;no;retry:',e)
'''
butt1 = Button(root, text="确定取消", command=but1, width=20, height=3)
butt2 = Button(root, text="问题是否", command=but2, width=20, height=3)
butt3 = Button(root, text="重试取消", command=but3, width=20, height=3)
butt4 = Button(root, text="三个选项", command=but4, width=20, height=3)
# butt5 = Button(root,text="重试共三个",command=but5,width=20,height=3)
butt1.pack()
butt2.pack()
butt3.pack()
butt4.pack()
# butt5.pack() 不存在这个
# 打开选择文件并输出文件路径
def but6():
f = tkinter.filedialog.askopenfilename()
f1 = tkinter.messagebox.showinfo('显示路径', f)
butt6 = Button(root, text="打开文件,显示路径", command=but6, width=20, height=3)
butt6.pack()
root.mainloop()
4.grid布局
5.place布局
6.菜单下拉功能
from tkinter import *
from tkinter import messagebox
def xinxi():
messagebox.showinfo('提示信息', f'你点击了该菜单')
root = Tk() # 窗口
menu = Menu(root) # 创建主菜单
menu_main = Menu(menu, tearoff=0) # 创建主菜单1
menu_main.add_command(label='打开', command=xinxi) # 子菜单
menu_main.add_command(label='保存', command=xinxi) # 子菜单
menu_main.add_separator() # 分隔符
menu_main.add_command(label='退出', command=root.quit) # 子菜单
menu_main2 = Menu(menu, tearoff=0) # 创建主菜单2
menu_main2.add_command(label='子菜单A', command=xinxi) # 子菜单
menu_main2.add_command(label='子菜单B', command=xinxi) # 子菜单
menu_main2.add_command(label='子菜单C', command=xinxi) # 子菜单
menu_main21 = Menu(menu_main2, tearoff=0) # 创建主菜单21
menu_main21.add_command(label='子菜单1', command=xinxi) # 子菜单
menu_main21.add_command(label='子菜单2', command=xinxi) # 子菜单
menu_main21.add_command(label='子菜单3', command=xinxi) # 子菜单
menu_main2.add_cascade(label='子菜单D', menu=menu_main21)
menu.add_cascade(label='主页', menu=menu_main) # 添加主菜单1到主菜单上
menu.add_cascade(label='帮助', menu=menu_main2) # 添加主菜单2到主菜单上
root.config(menu=menu) # 设置主菜单到界面
root.mainloop()
7.文本框输入写法
from tkinter import *
root = Tk()
text = Text(root, height=2, width=30)
text.pack()
def apress():
text.insert(END, 'a')
btn = Button(root, text = 'a', width = 5, command = apress)
btn.pack()
mainloop()