美文网首页
Python tkinter控件小结

Python tkinter控件小结

作者: 无话_ | 来源:发表于2021-08-15 22:40 被阅读0次

先放几个链接:
https://blog.csdn.net/weixin_37411471/article/details/88319880
https://blog.csdn.net/Z_love_u/article/details/109292907
https://blog.csdn.net/wosind/article/details/100071232#comments_13566676
这些文章写的已经比较详细了,个人认为GUI的难点主要在于事件与控件的绑定,需要拥有比较清晰的面向对象的编程思路,把事件这一概念拆为各个控件的属性,便于处理许多控件复杂交互。额,我一生信跑流程的,其实也只是大概有这点思路,面向对象编程这块我学得贼烂。
进入正题:

窗口:

import tkinter as tk
window = tk.Tk()
window.title('demo')#标题
window.geometry('300x100')#大小
window.mainloop()#循环使得窗口一直展示
图例:

Label:

import tkinter as tk
window = tk.Tk()
window.title('demo')#标题
window.geometry('300x100')#大小
tk.Label(window, text='用户名').grid(row=0, column=0, sticky='W')
tk.Label(window, text='密码').grid(row=1, column=0, sticky='E')
#这里使用grid布局,row为行,column为列,构成"格"(我取的名),
#但并不是每个控件长宽都完全相等,tinkter会将最大的那个作为格的标准,
#所以靠sticky后接NSEW(东南西北),表示控件在“”格”中的位置
window.mainloop()
图例:

Entry(后续就不把之前写过的代码再写一遍了):

uname = tk.Entry(window)
uname.grid(row=0, column=1, sticky='w')
passw = tk.Entry(window, show="*") #这样在输密码的时候显示的就是*
passw.grid(row=1, column=1, sticky='w')

图例:


Text:

dsp_text = tk.Text(window, width=25, height=3)  # 文本框
dsp_text.grid(row=2,column=1,sticky='w')
dsp_text.insert('end', '123456789')

图例:


Combobox:

from tkinter import ttk
#tkinter风格较老旧,ttk 是其子模块控件,组件更加美观、功能更加强大
demo_list=["a","b","c"]
dsp_combobox = ttk.Combobox(window,state='readonly', values=demo_list)
dsp_combobox.grid(row=1, column=2 )
dsp_combobox.current(1) #初始值设定为demo_list[1],即b

图例:


Button:

def insert_text():
    dsp_text.delete(1.0, 'end')
    dsp_text.insert('end',dsp_combobox.get())
button = ttk.Button(window,text="insert",command=insert_text)
button.grid(row=3, column=2)
#这里定义了一个事件,在按下insert按钮后,text框内文本就变成了复选框当前所选的内容

图例:



基础大概就这些,下面尝试点有趣的
首先是for循环制作控件

dic_op={ '-a': ["A1","A2","A3"], '-b':["B1","B2","B3"], '-c': ["C1","C2","C3"]}
i=0
for k,Value in dic_op.items(): 
    tk.Label(window, text=k).grid(row=4, column=i, sticky='W')
    k = ttk.Combobox(window,state='readonly', values=Value)
    k.grid(row=5, column=i )
    k.current(0)
    i+=1
#可以看到,在将combobox控件 A1部署在第一列后,第一列的“格”的宽度被拉长了,
#lable控件 用户名,由于sticky='W',其位置靠左,
#lable控件 密码,由于sticky='E',其位置靠右

图例:



接着,开始考虑用一个Button绑定事件,将所有 目前的 -a A1 -b B1 -c C1这段文本给弄到Text中
首先是错误示范
(其实这里还有all_text未定义的问题,嗯,是个合格的错误示范)



AttributeError: 'str' object has no attribute 'get'
这里说字符串对象没有get方法,经过一番操作后,把代码改成
dic_op={ '-a': ["A1","A2","A3"], '-b':["B1","B2","B3"], '-c': ["C1","C2","C3"]}
i=0
CHANGE=dict()
for k,Value in dic_op.items(): 
    tk.Label(window, text=k).grid(row=4, column=i, sticky='W')
    combox = ttk.Combobox(window,state='readonly', values=Value)
    combox.grid(row=5, column=i )
    combox.current(0)
    CHANGE[k]=combox
    i+=1
def insert_text2():
    all_text=""
    dsp_text.delete(1.0, 'end')
    for k in  dic_op.keys(): #
        if CHANGE[k].get() != "":
            all_text += k +" "+CHANGE[k].get()+" "
    dsp_text.insert('end',all_text)
button2 = ttk.Button(window,text="insert",command=insert_text2)
button2.grid(row=6, column=2)

图例:



什么,感觉这个按钮多余,想点一下combobox就直接修改text
错误示范


image.png
TypeError: insert_text2() takes 0 positional arguments but 1 was given
唉,似乎又是和面向对象有关。。。。。。

总之改为def insert_text2(self):........,就可以了


因为公司的脚本涉及到的长参数太多,所以心里萌生了做个gui偷懒的想法,东拼西凑的,其中许多细节我也没有深究。就最后这部分根据字符串取同名对象,面向对象编程啥的啥的,对此我也只是个半吊子。不知道有没有其它好办法,欢迎指教。

相关文章

网友评论

      本文标题:Python tkinter控件小结

      本文链接:https://www.haomeiwen.com/subject/invubltx.html