首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >显示一个小部件并通过绑定ComboboxSelected隐藏所有其他小部件

显示一个小部件并通过绑定ComboboxSelected隐藏所有其他小部件
EN

Stack Overflow用户
提问于 2022-03-26 21:35:16
回答 1查看 61关注 0票数 0

我对python和GUI-Thinker很陌生。我正在学习如何使用Tkinker作为UI和python作为编程语言在GUI上切换窗口。

我遵循这个指导原则tkinter中两帧间的切换在思想者中切换框架,它起了作用。

然后,我尝试使用bind("<<ComboboxSelected>>"显示小部件并隐藏所有其他小部件。但是当我选择Monthly选项时,我在DeleteOptions条件下设置的小部件没有出现。与Period选项相同的是,我在DeleteOptions条件下设置的小部件没有出现。

我的守则:

代码语言:javascript
运行
复制
from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkinter import font as tkfont
from tkcalendar import DateEntry

class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")

        # the container is where we'll stack a bunch of frames
        # on top of each other, then the one we want visible
        # will be raised above the others
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageOne):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is the start page", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)

        button1 = tk.Button(self, text="Go to Page One",
                            command=lambda: controller.show_frame("PageOne"))
        button1.pack()
        
class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is page 1", font=controller.title_font)
        label.grid()

        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.grid()

        def DeleteOptions():
            if SVcmb_Delete.current()=="Monthly":
                HideDeleteOptions()
                lblMonthly.grid(row=4)
                SVcmb_Monthly.grid(row=4, column=1)

            if SVcmb_Delete.current()=="Period":
                HideDeleteOptions()
                lblFrom.grid(row=4)
                txtFrom.grid(row=4, column=1)
                lblTo.grid(row=5)
                txtTo.grid(row=5, column=1)

        lblSV_Search=tk.Label(self,text="Delete by")
        lblSV_Search.grid(row=3)

        SVcmb_Delete=ttk.Combobox(self,state="readonly",justify=CENTER,font=("times new roman",15))
        SVcmb_Delete["values"]=("Select","Monthly","Period")
        SVcmb_Delete.grid(row=3,column=1)
        SVcmb_Delete.bind("<<ComboboxSelected>>", lambda event:DeleteOptions)

        def HideDeleteOptions():
            lblMonthly.grid_forget()
            SVcmb_Monthly.grid_forget()
            lblFrom.grid_forget()
            txtFrom.grid_forget()
            lblTo.grid_forget()
            txtTo.grid_forget()

        lblMonthly=tk.Label(self,text="Monthly")
        
        SVcmb_Monthly=ttk.Combobox(self,state="readonly",values=[1,2,3],justify=CENTER)
        
        lblFrom=tk.Label(self,text="From")
        
        txtFrom=DateEntry(self,selectmode='day',date_pattern='mm/dd/y')
        
        lblTo=tk.Label(self,text="To")
        
        txtTo=DateEntry(self,selectmode='day',date_pattern='mm/dd/y')
        
if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

在第一页。我正在寻找一种方法,比如当我选择Monthly选项时,DeleteOptions条件下的所有窗口小部件都会显示出来,而Period选项的所有小部件都会隐藏在DeleteOptions条件下。与Period选项相同的是,DeleteOptions条件下的所有小部件都会显示出来,而Monthly选项的所有小部件都是隐藏的,就像我在DeleteOptions条件下设置的那样。

请帮帮我。非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2022-03-26 23:39:21

您的代码有两个问题。首先是您的lambda表达式:

代码语言:javascript
运行
复制
SVcmb_Delete.bind("<<ComboboxSelected>>", lambda event:DeleteOptions)

是错误的,因为它实际上没有按照编写的方式调用DeleteOptions()函数。

相反,要这样做:

代码语言:javascript
运行
复制
SVcmb_Delete.bind("<<ComboboxSelected>>", lambda event: DeleteOptions())

第二个问题是在SVcmb_Delete.current()函数中使用DeleteOptions()方法,因为它返回当前条目文本的索引,而不是条目文本本身。要获得这个结果,您应该使用get()方法。有了这一修正,该函数看起来应该如下所示:

代码语言:javascript
运行
复制
    def DeleteOptions():
        if SVcmb_Delete.get() == "Monthly":
            HideDeleteOptions()
            lblMonthly.grid(row=4)
            SVcmb_Monthly.grid(row=4, column=1)

        if SVcmb_Delete.get() == "Period":
            HideDeleteOptions()
            lblFrom.grid(row=4)
            txtFrom.grid(row=4, column=1)
            lblTo.grid(row=5)
            txtTo.grid(row=5, column=1)

最后,我还强烈建议您阅读并开始遵循PEP 8- Python代码样式指南,以提高代码的可读性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71631998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档