Suvar
Suvar

Reputation: 341

New window is empty

I am trying to learn tkinter in python3. For some reasons the new window is empty (File > New Test) and I do not understand why. There are no messages about mistakes. I guess it is something with pack(), but documentation says that Toplevel does not need pack(). Could you please tell me how to make content visible in the new window.

import tkinter as tk
import sys

class MenuBar(tk.Menu):
    def __init__(self, master):
        tk.Menu.__init__(self, master)

        fileMenu = tk.Menu(self, tearoff=0)
        self.add_cascade(label="File", underline=0, menu=fileMenu)
        fileMenu.add_command(label="Exit", underline=1, command=self.quit)
        fileMenu.add_command(label="Start Test", underline=1, command=self.start_test)

    def quit(self):
        sys.exit(0)

    def start_test(self):
        self.app = RunTestWindow(self)

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

        self.master.title("Quiz")

        self.menubar = MenuBar(self)
        self.master.config(menu=self.menubar)

        self.button1 = tk.Button(self)
        self.button1['text'] = "Hello!"
        self.button1.grid(row=2, column=0)

        self.canvas = tk.Canvas(self, bg="white", width=400, height=400,
            bd=0, highlightthickness=0)
        self.canvas.grid(row=3, column=0)

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

        self.window = tk.Toplevel(self)

        self.label = tk.Label(self, text="Show me my new window")
        self.label.grid(row=1, column=0)


root = tk.Tk()
mw = MainWindow(root)
mw.pack()
root.mainloop()

Upvotes: 1

Views: 50

Answers (1)

furas
furas

Reputation: 143056

You have wrong parents in widgets and you may have to use pack() to show frame in window.

You can change it in many ways but you could do it similar to how you create main window.

def start_test(self):
    self.subwindow = tk.Toplevel(self)
    self.app = RunTestWindow(self.subwindow)
    self.app.pack()

and then in class you don't need Toplevel()

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

        self.label = tk.Label(self, text="Show me my new window")
        self.label.grid(row=1, column=0)

BTW: to close it you will need in main window

self.subwindow.destroy()

or in RunTestWindow()

self.master.destroy()

for example

class RunTestWindow(tk.Frame):

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

        self.label = tk.Label(self, text="Show me my new window")
        self.label.grid(row=1, column=0)

        self.button = tk.Button(self, text="Close", command=self.master.destroy)
        self.button.grid(row=2, column=0)

Full working code

import tkinter as tk
import sys


class MenuBar(tk.Menu):

    def __init__(self, master):
        tk.Menu.__init__(self, master)

        fileMenu = tk.Menu(self, tearoff=0)
        self.add_cascade(label="File", underline=0, menu=fileMenu)
        fileMenu.add_command(label="Exit", underline=1, command=self.quit)
        fileMenu.add_command(label="Start Test", underline=1, command=self.start_test)

    def quit(self):
        sys.exit(0)

    def start_test(self):
        self.subwindow = tk.Toplevel(self)
        self.app = RunTestWindow(self.subwindow)
        self.app.pack()


class MainWindow(tk.Frame):

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

        self.master.title("Quiz")

        self.menubar = MenuBar(self)
        self.master.config(menu=self.menubar)

        self.button1 = tk.Button(self)
        self.button1['text'] = "Hello!"
        self.button1.grid(row=2, column=0)

        self.canvas = tk.Canvas(self, bg="white", width=400, height=400,
            bd=0, highlightthickness=0)
        self.canvas.grid(row=3, column=0)


class RunTestWindow(tk.Frame):

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

        self.label = tk.Label(self, text="Show me my new window")
        self.label.grid(row=1, column=0)

        self.button = tk.Button(self, text="Close", command=self.master.destroy)
        self.button.grid(row=2, column=0)


root = tk.Tk()
mw = MainWindow(root)
mw.pack()
root.mainloop()

Upvotes: 1

Related Questions