在Tkinter的现有窗口中按按钮创建新窗口

时间:2018-11-28 00:40:46

标签: python pandas button tkinter

我在Tkinter GUI上遇到问题。我需要创建一个大型应用程序。我需要为此使用类来一起管理所有模块。为了在此处进行单元检查和获得帮助,我尝试在此处提供一个与确切问题非常接近的示例(带有一个小示例):

我正在创建一个带有标记为“测试”的按钮的第一个窗口。我想要的是,当我单击按钮“测试”时,将弹出一个新的第二个窗口,其中包含文本“输入值”和输入空间,我可以在其中输入值。我提供了下面的代码。发生的事情是,我能够获得新窗口,但是在第一个窗口而不是第二个窗口中生成了文本“ Enter Value”和输入空间,并且第二个窗口保持空白。我不知道我在哪里打错了逻辑调用。帮助将不胜感激。

我知道我们不需要用于GUI应用程序的类,但是要管理我的大型应用程序(此处未显示),我需要具有类,并且如果一些Tkinter Guru可以帮助我解决问题,我将非常感谢我的代码中的错误。

gui视图文件(gui_view.py)

import tkinter as tk

from tkinter import Tk

class MyMainGUI(tk.Frame):

       def __init__(self, controller):

        tk.Frame.__init__(self)
        self.pack()
        self.controller = controller

        self.Button1=tk.Button(self)
        self.Button1["text"]= "Test"
        self.Button1["command"]=self.controller.buttonPressed1
        self.Button1.grid(row=2,column=0,rowspan=2)


class MySecondGUI(tk.Frame):

       def __init__(self, controller):

        tk.Frame.__init__(self)
        self.pack()
        self.controller = controller

        self.outputLabel2 = tk.Label(self)
        self.outputLabel2["text"] = ("Enter Value")
        self.outputLabel2.grid(row=1,rowspan=2)

         #Entry Space
        self.entrySpace2 = tk.Entry(self)
        self.entrySpace2.grid(row=2,column=0,rowspan=2)


### gui Controller File (gui_controller.py)

import tkinter as tk 

import gui_view # the VIEW file


class MainControl:

    def __init__(self):    
        self.root = tk.Tk()
        self.root.geometry('550x200')
        self.view = gui_view.MyMainGUI(self)
        self.view.mainloop()

    def newWindow(self):

        self.newWin = tk.Toplevel(self.root)
        self.newWin.geometry('300x400')
        self.newDisplay = tk.Label(self.newWin, text='Test Mode')
        self.viewNew = gui_view.MySecondGUI(self.newWin)
        self.viewNew.mainloop()
        self.newDisplay.pack()

    def buttonPressed1(self):

         self.newWindow()

if __name__ == "__main__":

    c = MainControl()

添加新问题的修改代码。

当我在第一个窗口中单击“测试”按钮时,我现在已经能够生成一个代码,该代码会弹出一个带有条目的新窗口。但是,我在第二个窗口中创建按钮时遇到问题。 现在的方式,它向我弹出一个错误,说“'MySecondGUI'对象没有属性'buttonPressed2'

我们将非常感谢您的帮助。

我在下面粘贴了更新的代码:

GUI_VIEW FILE(gui_view.py)

将tkinter导入为tk

从tkinter导入Tk

MyMainGUI(tk.Frame)类:

def __init__(self, controller):

   tk.Frame.__init__(self)
   self.pack()
   self.controller = controller

   self.Button1=tk.Button(self)
   self.Button1["text"]= "Test"
   self.Button1["command"]=self.controller.buttonPressed1
   self.Button1.grid(row=2,column=0,rowspan=2)

MySecondGUI(tk.Toplevel)类:

   def __init__(self):

    tk.Toplevel.__init__(self)


    self.outputLabel2 = tk.Label(self)
    self.outputLabel2["text"] = ("Enter Value")
    self.outputLabel2.grid(row=5,rowspan=2)

    self.entrySpace2 = tk.Entry(self)
    self.entrySpace2.grid(row=8,column=0,rowspan=2)

    self.Button2=tk.Button(self)
    self.Button2["text"]= "Try Me"
    self.Button2["command"] = self.buttonPressed2
    self.Button2.grid(row=14,column=0,rowspan=2)enter code here

GUI主控制器文件

将tkinter导入为tk

import gui_view#VIEW文件

MainControl类:

def __init__(self):   
  self.root = tk.Tk()
  self.root.geometry('550x200')
  self.view = gui_view_temp.MyMainGUI(self)
  self.view.mainloop()

def newWindow(self):

  self.viewNew = gui_view.MySecondGUI()
  self.viewNew.geometry('300x400')
  self.newDisplay = tk.Label(self.newWin, text='Test Mode')
  self.viewNew.mainloop()
  self.newDisplay.pack()

def buttonPressed1(self):

     self.newWindow()

def buttonPressed2(self):

     pass

如果名称 ==“ 主要”:

c = MainControl()

1 个答案:

答案 0 :(得分:1)

在MySecondGUI(tk.Frame)中:

def __init__(self, controller):
    #Attach your frame to "secondGUI" (which is your second window)
    tk.Frame.__init__(self, controller) 

在MainControl类中:

#I assume you're passing your parent window/frame as "controller"?
self.viewNew = MySecondGUI(self.newWin)

根据Python Tkinter文档

https://docs.python.org/3.5/library/tkinter.html#mapping-basic-tk-into-tkinter

如果不将小部件附加到主窗口,则应指定父窗口。

#Main window
root = tk.Tk()
#Second Window
newWin = tk.Toplevel(root)

#Attach to main window
tk.Label(text="This label attached to root").pack()
tk.Button(text="This button attached to root").pack()

#Second Window
tk.Label(newWin, text="This label attached to second window").pack()
tk.Button(newWin, text="This button attached to second window").pack()

也是

self.viewNew.mainloop()
#This will fail because you have to set everything up before mainloop()
#_tkinter.TclError: can't invoke "pack" command: application has been destroyed
self.newDisplay.pack()

编辑更新

您应该放上

def buttonPressed2(self):

在MySecondGUI类中,而不在MainControl类中。

class MySecondGUI(tk.Toplevel):

    def __init__(self):

        tk.Toplevel.__init__(self)

        self.outputLabel2 = tk.Label(self)
        self.outputLabel2["text"] = ("Enter Value")
        self.outputLabel2.grid(row=5,rowspan=2)

        self.entrySpace2 = tk.Entry(self)
        self.entrySpace2.grid(row=8,column=0,rowspan=2)

        self.Button2=tk.Button(self)
        self.Button2["text"]= "Try Me"
        #self means "MySecondGUI" not "MainControl" here
        self.Button2["command"] = self.buttonPressed2
        self.Button2.grid(row=14,column=0,rowspan=2)

      def buttonPressed2(self):
          pass