Python Tkinter (二)

摘自 https://www.zhihu.com/question/32703639?sort=created

作者:Naples
链接:https://www.zhihu.com/question/32703639/answer/165326590
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

先说下我个人的情况,使用Matlab已3年有余,期间编写过几个专业方面的计算程序以及做过数个地铁振动信号处理分析方面的项目,有一定的编程基础。大概4个月前正式学习Python,用了2个月时间过了一遍Python的基本知识及语法,然后用了2~3天(课余时间)的时间仿照扇贝网背诵英语单词的模式,写了一个背诵日语单词的软件Anki的底层代码(200余句),输入输出都在shell里,用起来很不方便。然后开始尝试GUI,首先选择的就是Python自带的Tkinter,然后在网上找了Tkinter的相关文档:第一份是Tkinter简明教程,不知所云,几乎没什么帮助;第二份是2014年度辛星Tkinter教程第二版,内容浅显易懂;第三份是Python GUI Programming Cookbook,内容详细,帮助很大。大概用了5-6天的时间,边看文档写出了带有简单GUI界面的Anki2.0。又经过之后的组件升级,增加了许多功能,更新到了Anki3.2。先上图:

先上结论:Tkinter真的不像大家说的那么差,基本的功能都能实现,而且简单易学容易上手。对于界面颜值没有太高要求的,用Tkinter写GUI是不错的选择。

1、组件

本软件中用到了大概5个组件:

1.1、Button按钮

语法如下:创建了名为Play播放的按钮,绑定了命令sound_play。

b1 = ttk.Button(xin, text = 'Play\n播放',  width = 10, command = sound_play)
b1.grid(row=3,column=4, padx=10, pady=10)

1.2、Label标签

语法如下:创建了名为Model的标签。

mm1 = ttk.Label(xin, text = 'Model')
mm1.grid(row=0,column=1)

1.3、Combobox下拉列表

number = tk.StringVar()
LessonChosen = ttk.Combobox(xin, width=12, textvariable=number, state='readonly')
LessonChosen['values'] = lesson_name     # 设置下拉列表的值
LessonChosen.grid(column=2, row=1)      # 设置其在界面中出现的位置  column代表列   row 代表行
LessonChosen.current(lesson_name.index(str(WW[0])))    # 设置下拉列表默认显示的值,0为 LessonChosen['values'] 的下标值

1.4、LabelFrame

labelframe1 = ttk.LabelFrame(xin, text='単語    (第    课,第    个单词)', height = 80, width=300) # 信息区
labelframe1.grid(row=3,column=1, columnspan = 3 , padx=10, pady=10) 
labelframe1.propagate(0) # 使组件大小不变,此时width才起作用
ttk.Label(labelframe1, text = "  ",font = ('Mincho, 20')).pack(fill="both", expand="yes")

1.5、Radiobutton单选按钮

#单选按钮radiobutton
v=tk.IntVar()  
v.set(1)
#f1.bind('<KeyPress-1>',word_know)
f1 = tk.Radiobutton(xin,text = 'Know', font =24, variable=v,value=1, command = word_know)  
f1.grid(row=6,column=2)
f1.configure(state='disabled')
#f2.bind('<KeyPress-2>',word_unknow)
f2 = tk.Radiobutton(xin,text = 'Unknow',font =24,variable=v,value=2, command = word_unknow)  
f2.grid(row=6,column=3)
f2.configure(state='disabled')

下面贴一段与『Play播放』按钮绑定的sound_play函数的命令:

#Play按钮
def sound_play():
    import winsound
    import time
    import os
    global xin
    global word_list
    if back_canshu == 0:
        if len(word_list_now)==0:
            showinfo(title = 'Message', message = '恭喜,本次单词已经背完!')
            if BSM == 0:
                word_list1 = [R[1:3]]
                for i in range(len(word_list)):
                    if len(word_list[i])>=6:
                        if word_list[i][5]!='':
                            word_list1.append(word_list[i])
                del word_list
                word_list =word_list1
                #保存file.txt
                import os
                os.remove(r'.\file.txt')
                #写出单词表信息
                write_file_word(word_list,r'.\file.txt')
        else:
            if len(word_list_now)>=1:
                lesson = int(word_list_now[0][0])
                mn = int(word_list_now[0][1])
                if os.path.exists(r".\audio\L"+str(lesson)+"\L"+str(lesson)+"_"+str(mn)+".wav")==False:
                    winsound.PlaySound(r".\audio\Windows_Background.wav", winsound.SND_FILENAME|winsound.SND_ASYNC)
                    #第三行:labelframe单词
                    labelframe1 = ttk.LabelFrame(xin, text='単語    (第 '+str(lesson)+' 课,第 '+str(mn)+' 个单词)', height = 80, width=300) # 信息区
                    labelframe1.grid(row=3,column=1, columnspan = 3 , padx=10, pady=10) 
                    labelframe1.propagate(0) # 使组件大小不变,此时width才起作用
                    ttk.Label(labelframe1, text = word_list_now[0][2], font = ('Mincho, 20')).pack(fill="both", expand="yes")
                else:
                    winsound.PlaySound(r".\audio\L"+str(lesson)+"\L"+str(lesson)+"_"+str(mn)+".wav", winsound.SND_FILENAME|winsound.SND_ASYNC)
    else:
        lesson = int(word_back[-back_canshu][0])
        mn = int(word_back[-back_canshu][1])
        if os.path.exists(r".\audio\L"+str(lesson)+"\L"+str(lesson)+"_"+str(mn)+".wav")==False:
            winsound.PlaySound(r".\audio\Windows_Background.wav", winsound.SND_FILENAME|winsound.SND_ASYNC)
        else:
            winsound.PlaySound(r".\audio\L"+str(lesson)+"\L"+str(lesson)+"_"+str(mn)+".wav", winsound.SND_FILENAME|winsound.SND_ASYNC)

2、软件封装打包

Python Tkinter打包封装的方法有:PyInstaller, py2exe, wxPython等方法。答主只是用了PyInstaller来打包,感觉特别好用,对其它方法不做评论。

网上有很多打包方法:Python | 用Pyinstaller打包发布exe应用,请自行参考!

要说的是,打包过程中可以添加如下指令,自行尝试打包后的差异:

-w指令,在指令内加入-w命令可以屏蔽发布的exe应用带命令行调试窗口;

-F指令,使用-F指令可以把应用打包成一个独立的exe文件,否则是一个带各种dll和依赖文件的文件夹;

-i指令,可以自定义图标。

简单写一下用pyinstaller打包软件的过程:

①准备好打包文件:

aiueo.py为代码,audio文件夹、tango文件夹和file.txt为程序关联调用的文件,a.ico为软件图标。

②在安装的Python文件夹下的Scripts目录下(包含pyinstaller.exe),shift+右键>>在此处打开命令窗口:

③输入:pyinstaller.exe -i C:\Users\Naples\aiueo\a.ico -w C:\Users\Naples\aiueo\aiueo.py 回车。

-i C:\Users\Naples\aiueo\a.ico 为图标所在的目录;

-w C:\Users\Naples\aiueo\aiueo.py 为程序所在目录。

④在C:\Python34\Scripts目录下就会出现这三个文件:

可以将第一、三个文件删除,只留下dist文件夹。将和程序关联的audio文件夹、tango文件夹和file.txt三个文件夹拷贝到dist/aiueo/目录下。双击aiueo.exe,程序就可以使用了。

可以发送桌面快捷方式,也可以将软件打包拷贝到相同平台下的电脑上使用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值