tkinter学习
示例可以看python文件夹中study_tkinter.py。 参考文档:https://docs.python.org/3/library/tkinter.ttk.html
https://blog.csdn.net/nilvya?t=1
0、简介
类似qt。
这个问题就像你写个文档, 可以用自带记事本, 也可以用word.简单写几句话用记事本没问题, 简单做个小GUI用TK也没问题.但复杂的文档, 还是用Word这类更好的工具吧, 同理, 复杂的GUI还是用QT吧.比尔盖茨说他可以用basic写出任何程序, 咱们不是盖茨, 还是选个好工具吧. TK是打包直接送给你的东西, 就像记事本就是Windows送给你的一样.不用去了解具体的不同, 如果你想真正做Python GUI, 选PyQt就好了. 这样以后转其实开发, C++什么的, QT还是那个QT...
我们都知道当一个东西比较匮乏的时候,我们会比较苦恼,苦恼找不到好的替代。但是但一个东西比较丰富的时候,我们也会苦恼,苦恼的是如何进行选择。就比如每天我们都面临的一个巨大的难题就是今天中午吃什么?
python开发图形界面也有这样的烦恼,有很多gui框架提供我们选择,让我们眼花缭乱,我们很难从中选择一个。目前主流的有三个python gui框架。
1、text获取内容和设置内容
目前来看,先删除文本,然后再插入内容。
获取Text文本内容:text.get('0.0','end')
该方式表示获取text中现有的全部内容;
第一个参数‘0.0’是指从第0行第0列开始读取(‘1.3’表示从第一行第3列开始读取),第二个参数End表示最后一个字符
删除Text文本内容:
text.delete('0.0','end'):该方法是将text文本内的内容全部清空。
设置Text文本内容:
text.insert('end',s):该方法是将s插入到text的末尾,原来的内容不变;
text.insert('insert',s);该方法是将s插入到鼠标点击的地方;
2、组件之文本
Text 文本域: 多行文字区域,可用来收集(或显示)用户输入的文字,可以编辑文本格式,改变文本框的宽高 Entry 文本框:单行文字域,用来收集键盘输入,自带宽高,不可改变文本格式 entry.get()
Label
3、小组件上的焦点
takefocus选项设置为0将禁用选项卡专注于创建按钮。
4、小组件上的字体
style = ttk.Style()
style.configure("BW.TLabel", foreground="black", background="white")
l1 = ttk.Label(text="Test", style="BW.TLabel")
l2 = ttk.Label(text="Test", style="BW.TLabel")
5、pyinstaller无法打包图片到exe问题
打包成功后,报failed execute script xxx错误。 本来想打印日志来查错误,这也是最好的方法 https://blog.csdn.net/sinat_27382047/article/details/81304065
解决方案:将图片转换成编码保存到py文件里面,然后使用的时候导入py文件然后解码成图片。
Python\Python38-32\Scripts\build路径下打包项目文件里的warn-XXX.txt文件,一打开发现很多包丢失了missing,然后各种百度找解决办法,改路径hooks和rthook文件,折腾了大半天并没有解决问题。实际上根本就不是missing包引起的。 因为正常打包的文件可以使用的也同样有大量的missing包,例如我打包可以正常用的这个软件文件夹下同样有warn,实际上这都是误导。
6、ftp连接几分钟后自动断开
except ftplib.error_perm as err:
数据库、FTP等连接在长时间不使用之后会自动断开,导致下次使用时尚未登录而直接进行操作,将会导致出错。
原因 FTP或数据库服务器设置了会话无操作的timeout,当无操作的时间大于这个值的时候,将会导致服务器将连接切断(connection reset by peer)
解决 方法一:将服务器的timeout值设置得更长或者禁止服务器自动切断连接 方法二:曲线救国:在程序中使用一个定时任务或线程,每隔一段时间就向服务器发送一些无关紧要的请求使连接保持活跃,这样就不会超出timeout时间,因此就不会被服务器自动切断了。
线程写个timeout心跳?看其他人说心跳不管用,由于ftp连接本身的超时时间就已经挺大了,所以超时后再重新连接吧。
记事本参考:https://blog.csdn.net/lys_828/article/details/105380540
7、python中tkinter时出现两个弹窗的解决方案
今天在做tkinter弹窗时一直出现两个窗口,其中一个是正常的tkinter窗口,而另一个是以tk开头的弹窗,经过网上查阅资料得到了以下解决方案,亲测有效。
解决办法 在程序中加入以下代码即可:
root = tkinter.Tk()
root.withdraw()
正确代码
import tkinter
import tkinter.messagebox#弹窗库
#此处为解决问题的代码,其中tkinter为上方import的tkinter
root = tkinter.Tk()
root.withdraw()
tkinter.messagebox.showinfo('提示','你的输入有误')
8、python3tkinter去掉边框
import tkinter as tk
root = tk.Tk()
root.overrideredirect(True)
root.mainloop()
9、TclError: image "pyimage2" doesn't exist
因为在一个程序中只能存在一个根窗口,也就是说只能存在一个Tk(),其他的窗口只能以顶层窗口(Toplevel())的形式存在。
10、读取文件内容存储到一个字符串中
content = ''
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
except Exception as ex:
print('打开文件失败, error=', ex)
11、Failed to execute script copy_tool
https://blog.csdn.net/haimianjie2012/article/details/108058354
打包指令:pyinstaller -F -w copy_tool.py
-F(注意大写)是所有库文件打包成一个exe,-w是不出黑色控制台窗口。 不加-F参数生成一堆文件,但运行快。压缩后比单个exe文件还小一点点。 加-F参数生成一个exe文件,运行起来慢。
问题定位去掉w参数:pyinstaller -F copy_tool.py 双击exe文件会一闪而过,使用dos窗口运行exe,出现报错的具体原因。
原因:找不到库,修改相对路径为绝对路径解决
# 增加libary库的搜索路径
#sys.path.append('../../libary/')
sys.path.append('D:/Github/Storage/python/libary/')
# 导入自定义的Entry库
from entrywithplaceholder import EntryWithPlaceholder
然鹅把exe文件移到别处运行还是会报错,原因同样如此,最终发现是pyinstaller不会把自定义的module导入进来,解决办法如下:
https://q.cnblogs.com/q/111110
pyinstaller -F -w copy_tool.py D:\Github\Storage\python\libary\entrywithplaceholder.py --onefile
-F, --onefile Create a one-file bundled executable.
还有一个原因是代码调用出错,我这边发现是ftp库的函数调用出错,exe文件没有显示出错误,最终将整个代码拷贝的执行环境,然后python运行才发现具体的错误信息。 这告诉我们:代码拥有详细的debug信息很重要,不然就会像我这样出问题的时候需要一点一点的添加调试日志。
最终发现ftp.mkd不能创建多层目录,利用ftp.pwd()和ftp.dir()函数显示当前目录路径。 一定要增加捕获异常。