python 3.8 tkinter 从方法调用新 window 创建一个空白 window
python 3.8 tkinter calling new window from method creates a blank window
我正在尝试通过按下现有 window 的按钮来调用新的 window。当创建新的 window 时,原来的 window 应该关闭。当我按下按钮时,新的 window 将按预期显示,但还会出现一个空白的 window。使用 tk.Tk()
或 tk.Toplevel()
将导致相同的结果。
稍后在程序中我想再次销毁创建的 window。当使用 tk.Tk()
关闭空白 window 时,当 destroy()
方法应用于新的 window.[=18= 时,将产生错误“应用程序已被销毁” ]
import tkinter as tk
from tkinter import messagebox
def main():
root = tk.Tk()
root.title("Hauptmenü")
Menue = MainMenue(root)
Menue.pack()
root.mainloop()
class MainMenue(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
self.button_rennen = tk.Button(self, text="New Window", width=20, command=self.call_bet)
self.button_rennen.pack()
def call_bet(self):
self.destroy()
root2 = tk.Tk()
Bet = BetFrame(root2)
Bet.pack()
class BetFrame(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
self.button = tk.Button(text="Wette platzieren",
command=self.question)
self.button.pack()
def question(self):
dialog = tk.messagebox.askokcancel(message="Destroy Window?")
if dialog is True:
self.destroy()
main()
我正在为每个新的 window 创建一个新的 class,因为原始程序应该 return 一些变量。
我知道这个主题已经有很多问题,但对我来说 none 这些似乎很适合并帮助找到我的问题的解决方案。我很感激任何帮助!
看看这个:
import tkinter as tk
from tkinter import messagebox
class MainMenue(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
self.button_rennen = tk.Button(self, text="New Window", width=20,
command=self.call_bet)
self.button_rennen.pack()
def call_bet(self):
# `self.master` is the window
Bet = BetFrame(self.master)
Bet.pack()
self.destroy()
class BetFrame(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
# You need to tell the button that its master should be this BetFrame
# If you don't it will assume you mean the window so
# `self.destroy()` isn't going to destroy the button.
self.button = tk.Button(self, text="Wette platzieren", command=self.question)
self.button.pack()
def question(self):
dialog = tk.messagebox.askokcancel(message="Destroy Window?")
if dialog is True:
self.destroy()
def main():
root = tk.Tk()
Menue = MainMenue(root)
Menue.pack()
root.mainloop()
main()
您的代码很棒,但有 2 个错误:
- 与其创建一个新的 window 不如重复使用旧的更好。
- 当您在
BetFrame
class 中创建按钮时,您不会为主参数(第一个参数)传递任何内容。这就是为什么当您使用 self.destroy()
销毁 BetFrame
对象时按钮没有被销毁的原因
我正在尝试通过按下现有 window 的按钮来调用新的 window。当创建新的 window 时,原来的 window 应该关闭。当我按下按钮时,新的 window 将按预期显示,但还会出现一个空白的 window。使用 tk.Tk()
或 tk.Toplevel()
将导致相同的结果。
稍后在程序中我想再次销毁创建的 window。当使用 tk.Tk()
关闭空白 window 时,当 destroy()
方法应用于新的 window.[=18= 时,将产生错误“应用程序已被销毁” ]
import tkinter as tk
from tkinter import messagebox
def main():
root = tk.Tk()
root.title("Hauptmenü")
Menue = MainMenue(root)
Menue.pack()
root.mainloop()
class MainMenue(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
self.button_rennen = tk.Button(self, text="New Window", width=20, command=self.call_bet)
self.button_rennen.pack()
def call_bet(self):
self.destroy()
root2 = tk.Tk()
Bet = BetFrame(root2)
Bet.pack()
class BetFrame(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
self.button = tk.Button(text="Wette platzieren",
command=self.question)
self.button.pack()
def question(self):
dialog = tk.messagebox.askokcancel(message="Destroy Window?")
if dialog is True:
self.destroy()
main()
我正在为每个新的 window 创建一个新的 class,因为原始程序应该 return 一些变量。 我知道这个主题已经有很多问题,但对我来说 none 这些似乎很适合并帮助找到我的问题的解决方案。我很感激任何帮助!
看看这个:
import tkinter as tk
from tkinter import messagebox
class MainMenue(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
self.button_rennen = tk.Button(self, text="New Window", width=20,
command=self.call_bet)
self.button_rennen.pack()
def call_bet(self):
# `self.master` is the window
Bet = BetFrame(self.master)
Bet.pack()
self.destroy()
class BetFrame(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
# You need to tell the button that its master should be this BetFrame
# If you don't it will assume you mean the window so
# `self.destroy()` isn't going to destroy the button.
self.button = tk.Button(self, text="Wette platzieren", command=self.question)
self.button.pack()
def question(self):
dialog = tk.messagebox.askokcancel(message="Destroy Window?")
if dialog is True:
self.destroy()
def main():
root = tk.Tk()
Menue = MainMenue(root)
Menue.pack()
root.mainloop()
main()
您的代码很棒,但有 2 个错误:
- 与其创建一个新的 window 不如重复使用旧的更好。
- 当您在
BetFrame
class 中创建按钮时,您不会为主参数(第一个参数)传递任何内容。这就是为什么当您使用self.destroy()
销毁
BetFrame
对象时按钮没有被销毁的原因