PythonTkinter,在进入一个新窗口(一个新类)时,通过引入一个变量来避免代码重复

PythonTkinter,在进入一个新窗口(一个新类)时,通过引入一个变量来避免代码重复,python,class,tkinter,Python,Class,Tkinter,第一个问题 我对Python和Tkinter都是新手,并按照本指南使用Tkinter创建了多个窗口: 当用户在第一个窗口中做出选择时,假设我们每个月都有一个按钮,其中三个按钮(六月、七月、八月)代表夏天 像这样: months = ["january", "february" and so on] for i in months[0:2]: button = tk.Button(self, text=i, command=lambda:controller.show_frame(Pag

第一个问题

我对Python和Tkinter都是新手,并按照本指南使用Tkinter创建了多个窗口:

当用户在第一个窗口中做出选择时,假设我们每个月都有一个按钮,其中三个按钮(六月、七月、八月)代表夏天

像这样:

months = ["january", "february" and so on]

for i in months[0:2]:
    button = tk.Button(self, text=i, command=lambda:controller.show_frame(PageWinter)).pack()

for i in months[2:5]:
    button = tk.Button(self, text=i, command=lambda: controller.show_frame(PageSpring)).pack()
现在的问题是,我已经为每个季节创建了一个类。它工作得很好,但是,除了季节,所有的代码都是一样的,所以我只想创建一个类。代码重复并不漂亮:)我的问题是,我不知道如何(或者是否可能)将用户选择的月份(代表某个季节)带到课堂上

现在我有四个不同的类,如下所示:

class PageSpring(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)

     a whole lot of code
     ...
     ...
     season=Spring

     more code....

        mlabel3=tk.Label(self, text="Results:").pack()
        mlabel4=tk.Label(self, text=pres).pack()

        button2 = tk.Button(self, text="Back to Startpage",
                            command=lambda: controller.show_frame(StartPage)).pack()
相反,我想要一个这样的课程,在那里,用户可以选择季节。我尝试过的所有方法都不奏效,这个赛季一直在变得不明确,或者其他一些东西缺失了

class Season(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)

     a whole lot of code
     ...
     ...     
     more code....

        mlabel3=tk.Label(self, text="Results:").pack()
        mlabel4=tk.Label(self, text=pres).pack()

        button2 = tk.Button(self, text="Back to Startpage",
                            command=lambda: controller.show_frame(StartPage)).pack()

但是我如何才能将季节带到这个通用类中呢?

您将季节发送到通用类的方式与发送给它的方式相同:将季节作为参数传递给它

def __init__(self, parent, controller, season):
此外,不要将几何体管理与小部件创建联系起来。而不是:

mybutton = Button(parent).pack()
做:


它似乎是多余的,但在较短的版本中,
按钮
并不是一个真正的
按钮
——它是
,由
pack()
返回。保存
按钮
比保存
更有用

关于链几何体管理的精彩评论。我见过大多数人都像你建议的那样做,但直到现在我还不明白为什么。非常感谢。如前所述,我对Python(和编程)非常陌生,我的头脑刚刚开始掌握类的工作方式。我像视频中的sentdex一样构建了我的程序(有一个SeaofBTCapp类和一个StartPage类),但当我尝试添加季节时,我只收到了“‘季节’未定义”。有什么想法吗?如果我发布更多的代码会有帮助吗?至少我知道我需要做什么来解决我的麻烦,现在只需要学习:)再次感谢!如果您像在代码中那样执行
seasure=Spring
Spring
是一个变量,您应该在使用之前定义它。如果您只想询问对象现在是什么季节,可以为其指定一个简单的字符串,例如
seasure=“spring”
。我还建议使用
self
指定对象自己的属性,例如
self.seasure=“spring”
.Progress!正如我所希望的那样,我将它简化为一个类,但是它没有根据用户的选择来调整季节,而是继续使用默认的季节(本例中为春季)。下面是它现在的样子:类StartPage(tk.Frame):def uuu init uuu(self,parent,controller):tk.Frame.uuu init uuuu(self,parent)for i in months[0:2]:season=“Winter”button=tk.button(self,text=i,command=lambda:controller.show_Frame(PageSeason)).pack()(我们也尝试过self.parent=“Winter”,但最后一部分比较复杂)新的generel类如下所示:类PageSeason(tk.Frame):def _uinit(self,season,controller):tk.Frame._u init_;(self,season)
mybutton = Button(parent)
mybutton.pack()