Search code examples
pythonimporttkinterinterfacewindow

import a python file that create a window when main window button clicks


I am creating 2 window in my program and i am using two class, since the code is complex, i separate it in 2 different python file. After i imported the second window file, how can i make sure it open without having this error which show in this picture enter image description here

The original result should look like this after the new window button clicked: enter image description here

Coding for Main Window:

from tkinter import *
import classGUIProgram
class Window(Tk):
    def __init__(self, parent):
        Tk.__init__(self, parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.geometry("600x400+30+30")
        self.wButton = Button(self, text='newWindow', command =     self.OnButtonClick)
        self.wButton.pack()

    def OnButtonClick(classGUIProgram):
        classGUIProgram.top = Toplevel()
        master = Tk()
        b = classGUIProgram.HappyButton(master)
        master.mainloop()
if __name__ == "__main__":
    window = Window(None)

    window.title("title")

    window.mainloop()

Coding for Second Window:

from tkinter import *
class HappyButton:
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        self.printButton = Button(frame, text="Print message", command=self.printMessage)
        self.printButton.pack(side=LEFT)

        self.quitButton = Button(frame, text="Quit", command= quit)
        self.quitButton.pack(side=LEFT)

        self.downloadHistoryCB=Checkbutton(frame, text="Download History")
        self.downloadHistoryCB.pack(side=LEFT)

    def printMessage(self):
        print("Wow this actually worked!")

master = Tk()
b = HappyButton(master)
master.mainloop()

Solution

  • You're creating extra Tk windows. Here is an example of using Toplevel widgets and another file.

    mainWindow.py

    import tkinter as tk
    import secondWindow as sW
    
    class MainWindow(tk.Tk):
        def __init__(self):
            super().__init__()
            self.title("Main Window")
            self.geometry("600x400+30+30")
    
            tk.Button(self, text = "New Window", command = self.new_window).pack()
            tk.Button(self, text = "Close Window", command = self.close).pack()
    
            self._second_window = None
    
        def new_window(self):
            # This prevents multiple clicks opening multiple windows
            if self._second_window is not None:
                return
    
            self._second_window = sW.SubWindow(self)
    
        def close(self):
            # Destory the 2nd window and reset the value to None
            if self._second_window is not None:
                self._second_window.destroy()
                self._second_window = None
    
    
    if __name__ == '__main__':
        window = MainWindow()
        window.mainloop()
    

    secondWindow.py

    import tkinter as tk
    
    class SubWindow(tk.Toplevel):
        def __init__(self, master):
            super().__init__(master)
    
            self.title("Sub Window")
            self.geometry("400x300+30+30")
            # Change what happens when you click the X button
            # This is done so changes also reflect in the main window class
            self.protocol('WM_DELETE_WINDOW', master.close)
    
            tk.Button(self, text = "Print", command = self.printMessage).pack()
    
        def printMessage(self):
            print("Wow this actually worked!")
    

    When using another file be sure to not have any global code you don't want running. Your classes don't have to inherit from Tk and Toplevel, this is just an example. But you need to ensure you only ever have one instance of Tk otherwise you get the behaviour you encountered