Python学习笔记(三)tkinter常见问题总结

Tkinter:

问题一:控件使用bind事件时,报错:TypeError: versioninfo_Msgbox() takes 1 positional argument but 2 were given

        self.version_info_label = Label(self.init_window_name,text='版本更新日志',underline= -1,font=('',6),fg='blue')

        self.version_info_label.grid(row=12, column=1,sticky=E+S)

        self.version_info_label.bind('<Button-1>',self.versioninfo_Msgbox)

versioninfo_Msgbox这里默认已经有2个参数了:1、定义在class方法内,有一个默认self传参  2、使用了bind方法,默认有一个event事件参数

所以,versioninfo_Msgbox方法要定义2个参数:

    def versioninfo_Msgbox(event,self):

        messagebox.showinfo(title="更新日志",message="1、新增订金支付、尾款支付\n2、新增自动获取支付金额\n3、新增国内、海外,国内没有自测过\n4、只支持普通订单、订金订单\n5、新增获取BE配置项功能\n6、bug联系yangsheng 00011533")

问题二:如何通过点击事件创建一个新窗口

一开始直接新建一个py文件,重新写了一个gui’实现,然后穿件tk实例,mainloop。主py文件的按钮事件调用新py里的gui mainloop实例。发现存在问题,控件初始化会错乱。

解决方法,使用tkinter的子窗口方法,Toplevel:这里的init_window_name就是主窗口的TK()实例,生成一个Toplevel的子窗口实例,传给SUB_GUI进行控件初始化sub_init_windos.

    def sub_Window(self):

        BE_WINDOW = Toplevel(self.init_window_name)

        BE_PORTAL = SUB_GUI(BE_WINDOW)

        BE_PORTAL.sub_init_window()

问题三:如果在主窗口设置子窗口

      主窗口点击button后,调用方法拉起子窗口

    def get_BE_Config(self):

        BE_WINDOW = Toplevel(self.init_window_name)  这里的init_window_name 就是实例化的TK()父窗口   Tkinter Toplevel:顶层部件的工作,直接由窗口管理器管理的窗口

        BE_PORTAL = SUB_GUI(BE_WINDOW)   //子窗口定义的类SUB_GUI,初始化对象

        BE_PORTAL.BeConfig_init_window()  调用子窗口的页面元素

问题四:使用grid窗格方式布局出现的问题

        self.init_window_name.title("test")           #窗口名

        #self.init_window_name.geometry('200x160+10+10')                         #290 160为窗口大小,+10 +10 定义窗口弹出时的默认展示位置

        self.init_window_name.geometry('310x600+90+20')

        #self.init_window_name["bg"] = "pink"                                    #窗口背景色,其他背景色见:blog.csdn.net/chl0000/article/details/7657887

        #self.init_window_name.attributes("-alpha",0.9)                          #虚化,值越小虚化程度越高

        #label1

        self.init_data_label = Label(self.init_window_name, text="label1:")

        self.init_data_label.grid(row=0, column=0,padx=2)

        self.init_data_entry_uid = Entry(self.init_window_name)

        self.init_data_entry_uid.grid(row=0,column=1,padx=0,pady=5,sticky=W)

        #label2

        self.result_data_label = Label(self.init_window_name, text="label2 long name:")

        self.result_data_label.grid(row=1, column=0,padx=2)

        self.init_data_entry_ordernum = Entry(self.init_window_name)

        self.init_data_entry_ordernum.grid(row=1,column=1,padx=0,pady=5,sticky=W)

        #radio

        self.env_data = tkinter.IntVar()

        self.env_data.set(ENV_DATA)

        self.env_data_radiobtn = Radiobutton(self.init_window_name,text='radio1',variable=self.env_data,value=0,command=self.get_env_data)

        self.env_data2_radiobtn = Radiobutton(self.init_window_name,text='radio2',variable=self.env_data,value=1,command=self.get_env_data)

        self.env_data_radiobtn.grid(row=2,column=0,padx=5,sticky=W)

        self.env_data2_radiobtn.grid(row=2,column=1,padx=5,sticky=W)

        ##样式分割

        self.separator = ttk.Separator(self.init_window_name,orient=HORIZONTAL,style='black.TSeparator')

        self.separator.grid(row=3,column=0,columnspan=2, padx=10, pady=5,sticky=EW)

        #下拉框

        self.result_data_label = Label(self.init_window_name, text="label3")

        self.result_data_label.grid(row=4, column=0,sticky=E+W)

        self.combobox = ttk.Combobox(

            master=self.init_window_name,  # 父容器

            height=7,  # 高度,下拉显示的条目数量

            width=25,  # 宽度

            state='readonly',  # 设置状态 normal(可选可输入)readonly(只可选) disabled

            cursor='arrow',  # 鼠标移动时样式 arrow, circle, cross, plus...

            font=('', 12),  # 字体

            textvariable='test',  # 通过StringVar设置可改变的值

            values=OPERATE_VALUES,  # 设置下拉框的选项

            )

        self.combobox.current(0)

        self.combobox.grid(row=4,column=1,pady=2,padx=2,sticky=W)

        #确定按钮

        self.modify_order_status_button = Button(self.init_window_name, text="确定", bg="lightblue", width=10,command=self.__modify_order_status)  # 调用内部方法  ()为直接调用

        self.modify_order_status_button.grid(row=5, column=1,padx=5,pady=10,sticky=E)

Python学习笔记(三)tkinter常见问题总结

这个grid中的column 0没有对齐,按照row 1的最大长度被拉伸了,这时候修改row 1的label控件,效果会相对整齐,如下:

        self.result_data_label = Label(self.init_window_name, text="label2:")

Python学习笔记(三)tkinter常见问题总结

如果label2的名字确实很长,那么修改几个label的对齐方式,在grid方法中添加sticky=W(west,左对齐),效果如下:

self.init_data_label.grid(row=0, column=0,padx=2,sticky = W)

Python学习笔记(三)tkinter常见问题总结

这时候发现由于column 0的长度拉伸,column 1的部分组件展示截断了:

Python学习笔记(三)tkinter常见问题总结

解决办法,调整window的geometry的宽度:

self.init_window_name.geometry('310x600+90+20')

上一篇:在docker中出现的僵尸进程怎么处理


下一篇:vue-cli · Failed to download repo vuejs-templates/webpack: connect ETIMEDOUT 192.30.253.112:443