我对python和GUI-Thinker很陌生。我正在学习如何使用Tkinker作为UI和python作为编程语言在GUI上切换窗口。
我遵循这个指导原则tkinter中两帧间的切换在思想者中切换框架,它起了作用。
然后,我尝试使用bind("<<ComboboxSelected>>"
显示小部件并隐藏所有其他小部件。但是当我选择Monthly
选项时,我在DeleteOptions
条件下设置的小部件没有出现。与Period
选项相同的是,我在DeleteOptions
条件下设置的小部件没有出现。
我的守则:
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
条件下设置的那样。
请帮帮我。非常感谢。
发布于 2022-03-26 23:39:21
您的代码有两个问题。首先是您的lambda
表达式:
SVcmb_Delete.bind("<<ComboboxSelected>>", lambda event:DeleteOptions)
是错误的,因为它实际上没有按照编写的方式调用DeleteOptions()
函数。
相反,要这样做:
SVcmb_Delete.bind("<<ComboboxSelected>>", lambda event: DeleteOptions())
第二个问题是在SVcmb_Delete.current()
函数中使用DeleteOptions()
方法,因为它返回当前条目文本的索引,而不是条目文本本身。要获得这个结果,您应该使用get()
方法。有了这一修正,该函数看起来应该如下所示:
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代码样式指南,以提高代码的可读性。
https://stackoverflow.com/questions/71631998
复制相似问题