【问题标题】:Tkinter won't open more than two windowsTkinter 不会打开两个以上的窗口
【发布时间】:2016-11-25 21:04:08
【问题描述】:

我正在使用 Tkinter 在 python 中开发一个程序。我目前遇到的问题是我有打开另一个窗口的按钮。我的问题是它不能打开两个以上的窗口。有关如何解决此问题的任何想法。

from tkinter import *

class first(object):
    def __init__(self, master):
        self.master = master
        self.admin_btn = Button(master, text = "First", command = self.second)
        self.admin_btn.grid(row = 0, column = 0)

    def second(self):
        self.w = second(self.master)
        self.master.wait_window(self.w.top)

class second(object):
    def __init__(self, master):
        top = self.top = Toplevel(master)
        self.second = Button(top, text = "Second", command = self.third)
        self.second.grid(row= 0, column = 0)

    def third(self):
        self.w = third(self.master)
        self.master.wait_window(self.w.top)

class third(object):
    def __init__(self, master):
        top = self.top = Toplevel(master)
        self.second = Button(top, text = "Third")
        self.second.grid(row= 0, column = 0)


if __name__ == "__main__":
    root = Tk()
    m = first(root)
    root.mainloop()

【问题讨论】:

  • 在 console/termina/cmd.exe/powershell 中运行它,当您尝试打开第三个窗口时会看到错误消息
  • 请不要破坏您的帖子。

标签: python windows tkinter master


【解决方案1】:

你忘了在第二个窗口

self.master = master

当您尝试打开第三个窗口时收到错误消息。

但您应该将Toplevel(master) 分配给self. master,然后使用self.master 而不是self.top

from tkinter import *


class First(object):

    def __init__(self, master):
        self.master = master # = Tk()
        self.btn = Button(self.master, text="First", command=self.second)
        self.btn.grid(row=0, column=0)

    def second(self):
        self.w = Second(self.master)
        self.master.wait_window(self.w.master)


class Second(object):

    def __init__(self, master):
        self.master = Toplevel(master)
        self.btn = Button(self.master, text="Second", command=self.third)
        self.btn.grid(row=0, column=0)

    def third(self):
        self.w = Third(self.master)
        self.master.wait_window(self.w.master)


class Third(object):

    def __init__(self, master):
        self.master = Toplevel(master)
        self.btn = Button(self.master, text="Third")
        self.btn.grid(row=0, column=0)


if __name__ == "__main__":
    root = Tk()
    first = First(root)
    root.mainloop()

现在所有类看起来都非常相似——它们有self.master = Tk()self.master = Toplevel(master)


顺便说一句:对类使用 CamelCase 名称 - FirstSecondThird - 它有助于识别代码中的类。

【讨论】:

    【解决方案2】:

    我建议你所有的类都继承自 Toplevel 而不是对象,这样,你所有的类都会有一个master 属性(这就是你出错的原因,second 类没有):

    from tkinter import *
    
    class First(Toplevel):
        def __init__(self, master):
            Toplevel.__init__(self, master)
            self.admin_btn = Button(self, text = "First", command = self.second)
            self.admin_btn.grid(row=0, column=0)
    
        def second(self):
            self.w = Second(self)
            self.wait_window(self.w)
    
    class Second(Toplevel):
        def __init__(self, master):
            Toplevel.__init__(self, master)
            self.second = Button(self, text = "Second", command = self.third)
            self.second.grid(row=0, column=0)
    
        def third(self):
            self.w = Third(self.master)
            self.wait_window(self.w)
    
    class Third(Toplevel):
        def __init__(self, master):
            Toplevel.__init__(self, master)
            self.second = Button(self, text = "Third")
            self.second.grid(row=0, column=0)
    
    
    if __name__ == "__main__":
        root = Tk()
        m = First(root)
        m.lift(root)
        root.wait_window(m)
        root.mainloop()
    

    【讨论】:

      【解决方案3】:

      尝试使用此代码:

      import tkinter as tk
      
      class Demo1:
          def __init__(self, master):
              self.master = master
              self.frame = tk.Frame(self.master)
              self.button1 = tk.Button(self.frame, text = 'First', width = 25, command = self.new_window)
              self.button1.pack()
              self.frame.pack()
          def new_window(self):
              self.newWindow = tk.Toplevel(self.master)
              self.app = Demo2(self.newWindow)
      
      class Demo2:
          def __init__(self, master):
              self.master = master
              self.frame = tk.Frame(self.master)
              self.quitButton = tk.Button(self.frame, text = 'Second', width = 25, command = self.close_windows)
              self.quitButton.pack()
              self.frame.pack()
          def close_windows(self):
              self.master.destroy()
      
      def main(): 
          root = tk.Tk()
          app = Demo1(root)
          root.mainloop()
      
      if __name__ == '__main__':
          main()
      

      在这段代码中,我添加了两个窗口,但您可以添加第三个。

      【讨论】:

        猜你喜欢
        • 2018-11-17
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        • 2017-01-17
        相关资源
        最近更新 更多