【问题标题】:Cannot understand why window will not open when adding `self.`无法理解为什么添加`self.`时不会打开窗口。
【发布时间】:2018-11-08 20:32:28
【问题描述】:

我正在尝试制作具有多个帧的 tkinter 应用程序。

在我的代码中,在settings 类中的任何声明前面添加self.(如self.name)意味着窗口不会打开。为什么?

class app(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switchFrame(settings)

def switchFrame(self, frame_class):
       new_frame = frame_class(self)
       if self._frame is not None:
           self._frame.destroy()
       self._frame = new_frame
       self._frame.pack()

class settings(tk.Frame):
    def __init__(self, master):
    tk.Frame.__init__(self, master)

    lengthSliderTitle = "Set the race length in metres"

    tk.Label(master, text = lengthSliderTitle).grid(column= 0, row = 1)
    raceLengthSlider = tk.Scale(master, from_=1000, to=10000, length= 600, tickinterval = 1000, orient=tk.HORIZONTAL)
    raceLengthSlider.grid(column = 0, row = 2)

    racersNumSliderTitle = "Set the amount of racers"

    tk.Label(master, text = racersNumSliderTitle).grid(column = 0, row = 4)
    racersNumSlider = tk.Scale(master, from_= 2, to= 50, length = 600, tickinterval = 5, orient=tk.HORIZONTAL)
    racersNumSlider.grid(column= 0, row = 5)

    finishScreen1btn = tk.Button(master, text = "Done", command = self.finishScreen1)
    finishScreen1btn.grid(column = 0, row = 6)

def finishScreen1():
    currentRace.length = raceLengthSlider.get()
    currentRace.numRacers = racersNumSlider.get()
    master.switchFrame(animalsettings).pack()

switchFrame 是主应用程序用来在帧之间切换的东西。每个框架都有一个类似于settings 类的结构。

finishScreen1btn = tk.Button(master, text = "Done", command = self.finishScreen1) 行是使窗口不出现的原因。发生的情况是 Python 终端没有打印任何错误,但也没有打开任何窗口。

【问题讨论】:

  • 请勿将代码发布为图片
  • @Norrius 修复了这个问题。由于某种原因,Mac 上的 IDLE 不允许复制和粘贴。
  • 你的代码真的是这样缩进的吗?有很多缩进错误。
  • 在纠正缩进并为finishScreen1btn创建回调函数后,程序运行并显示窗口。将.self 添加到settings() 中的名称后,窗口将像以前一样显示。能否请您发布产生错误的代码。
  • @figbeam 看来我在制作finishScreen1btn 时使用了错误的回调函数名称。回调函数是finishScreen1,所以我编辑了这个问题。另外,我在我的问题中添加了产生错误的代码。

标签: python macos user-interface tkinter


【解决方案1】:

我无法让窗口不显示。我能找到的唯一重大错误是没有将父级的名称正确保存在 settings() 类中。见下文:

import tkinter as tk

class app(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switchFrame(settings)

    def switchFrame(self, frame_class):
           new_frame = frame_class(self)
           if self._frame is not None:
               self._frame.destroy()
           self._frame = new_frame
           self._frame.grid()

class settings(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.master = master    # Save referense to an instance variable

        self.lengthSliderTitle = "Set the race length in metres"

        tk.Label(master, text = self.lengthSliderTitle).grid(column=0, row=1)
        self.raceLengthSlider = tk.Scale(master, from_=1000, to=10000,
                                         length=600, tickinterval=1000,
                                         orient=tk.HORIZONTAL)
        self.raceLengthSlider.grid(column=0, row=2)

        self.racersNumSliderTitle = "Set the amount of racers"

        tk.Label(master, text=self.racersNumSliderTitle).grid(column=0, row=4)
        self.racersNumSlider = tk.Scale(master, from_=2, to=50, length=600,
                                        tickinterval=5, orient=tk.HORIZONTAL)
        self.racersNumSlider.grid(column=0, row=5)

        self.finishScreen1btn = tk.Button(master, text="Done",
                                          command=self.finishScreen1)
        self.finishScreen1btn.grid(column=0, row=6)

    def finishScreen1(self):
        self.currentRace_length = self.raceLengthSlider.get()
        self.currentRace_numRacers = self.racersNumSlider.get()
        self.master.switchFrame(animalsettings).pack()  # Call master object

app = app()
app.mainloop()

animalsettings 函数没有实现,所以仍然会产生错误。

【讨论】:

  • 谢谢!那我的 tkinter 或者 python 版本肯定有问题。
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2021-06-05
  • 2020-04-04
  • 2015-05-12
  • 1970-01-01
相关资源
最近更新 更多