Python 2 tkinter, 贷款 window 出现在没有被要求的时候

Python 2 tkinter, a loan window appears when it has not been called for

我在使用 tkinter 消息框时遇到了一个问题,当我的应用程序的用户按下英文标志然后转到右上角的 Log-out 时,会出现一个消息框,但也会出现另一个消息框框出现 window 标题 'tk',我没有制作或调用任何这样的 window 所以我的理论是 window 来自消息框的某个地方或也许是我在我的代码中错误地做了一些我看不到的事情。

下面是我的代码;

import tkinter
from tkinter import *
from tkinter import messagebox as box
Title_Text = 25
Title_Font = "Courier"
Font = 'Ariel'
Rest_Text = 16
Background_Colour = 'Light blue'




def EngFlag():
    print('Hello world')

def LogOut1():
    response = box.askquestion ('?', 'Are You Sure?')
    if response == 'yes':
        try:
         window.destroy()
        except:
         Eng_window.destroy()




def back1():
    Home_Screen()


def Home_Screen():
    global window
    window = Tk()
    window.geometry('1366x768')
    window.configure(background = Background_Colour)
    window.title('Local Languages Learning System')
    window.resizable(width=False, height=False)

    try:
        Eng_window.destroy()
    except:
        pass



    Title1 = Label(window, text = 'Local Languages Home Screen', bg = Background_Colour)
    Title1.config(font=("Courier", Title_Text))
    Title1.pack()
    Title1.place(y = 1, x = 450)


    Question_Label = Label(window, text = 'Please Pick The Language You Wish To Learn', bg = Background_Colour)
    Question_Label.config(font=(Font, Rest_Text))
    Question_Label.pack()
    Question_Label.place(y = 200, x = 495)

    Log_Out = Button(window, text = 'Log-Out', height = 1, width = 8, command = LogOut1)
    Log_Out.pack()
    Log_Out.place(y = 5, x = 1290)


    help_btn = Button(window, text = 'Help', height = 1, width = 8, command = None)
    help_btn.pack()
    help_btn.place(y = 45, x = 1290)



    English_Flag = PhotoImage(file = 'EnglishFlag.gif')
    English_Flag_btn = Button(window, image = English_Flag, command = English_Home_Screen)
    English_Flag_btn.pack(side = LEFT, padx = 10)
    English_Flag_btn.place(y = 350, x = 300)


    Polish_Flag = PhotoImage(file = 'PolishFlag.gif')
    Polish_Flag_btn = Button(window, image = Polish_Flag, command = EngFlag)
    Polish_Flag_btn.pack(side = LEFT, padx = 10)
    Polish_Flag_btn.place(y = 350, x = 600)


    Italian_Flag = PhotoImage(file = 'ItalianFlag.gif')
    Italian_Flag_btn = Button(window, image = Italian_Flag, command = None)
    Italian_Flag_btn.pack(side = LEFT, padx = 10)
    Italian_Flag_btn.place(y = 350, x = 900)



    window.mainloop()

def English_Home_Screen():
    global Eng_window
    Eng_window = Tk()
    Eng_window.geometry('1366x768')
    Eng_window.configure(background = Background_Colour)
    Eng_window.title('Local Languages Learning System')
    Eng_window.resizable(width=False, height=False)
    window.destroy()


    Title1 = Label(Eng_window, text = 'Local Languages\nEnglish Home Screen', bg = Background_Colour)
    Title1.config(font=("Courier", Title_Text))
    Title1.pack()
    Title1.place(y = 1, x = 450)


    Log_Out = Button(Eng_window, text = 'Log-Out', height = 1, width = 8, command = LogOut1)
    Log_Out.pack()
    Log_Out.place(y = 5, x = 1290)


    Back = Button(Eng_window, text = 'Back', height = 1, width = 8, command = back1)
    Back.pack()
    Back.place(y = 5, x = 1210)



    help_btn = Button(Eng_window, text = 'Help', height = 1, width = 8, command = None)
    help_btn.pack()
    help_btn.place(y = 45, x = 1290)


    Play_all = Button(Eng_window, text = 'Play All Games', height = 2, width = 20, command = None)
    Play_all.pack()
    Play_all.place(y = 100, x = 320)


    Multiple_Choice = Button(Eng_window, text = 'Play Multiple Choice Game', height = 2, width = 20, command = None)
    Multiple_Choice.pack()
    Multiple_Choice.place(y = 100, x = 510)


    Picture = Button(Eng_window, text = 'Play Picture Game', height = 2, width = 20, command = None)
    Picture.pack()
    Picture.place(y = 100, x = 700)


    Memory = Button(Eng_window, text = 'Play Memory Game', height = 2, width = 20, command = None)
    Memory.pack()
    Memory.place(y = 100, x = 890)


    LeaderBoard = Button(Eng_window, text = 'LeaderBoard', height = 2, width = 20, command = None)
    LeaderBoard.pack()
    LeaderBoard.place(y = 160, x = 600)


Home_Screen()

很抱歉这么长,但要真正看到问题,您必须拥有所有代码。任何帮助或修正都会很棒。

现在您的代码有几个问题,我将解决一些问题。

首先,当使用 Non-OOP 方法时,您尝试做的事情非常复杂。我有 re-written 你的代码作为 OOP 以提供一些易用性和可读性。

在大多数情况下,您应该避免使用 global,最简单的方法是使用 class 属性。这允许您拥有一个可以通过 class.

中的任何方法看到的变量

一些有用的提示:

不要两次导入 tkinter。 而不是做:

import tkinter
from tkinter import *
from tkinter import messagebox as box

改为这样做:

import tkinter as tk
from tkinter import messagebox

您的 Try/Except 函数将不会像您预期的那样工作,因为 Eng_window.destroy() 不会 return 一个错误,无论 window 是否存在。所以它总是会尝试破坏 Eng_window 而永远不会 window

改为这样做:

# This will check if the instance of Eng_self_window exist first.
if tk.Toplevel.winfo_exists(self.Eng_self_window):
    self.Eng_self_window.destroy()
else:
    self.window.destroy()

如果您对 class 设置有任何疑问,请告诉我。 它可以使用全局的来完成,但它不那么干净且更难处理。

我已将您的代码移至 class 并重新排列了一些内容。

import tkinter as tk
from tkinter import messagebox

class Home_Screen(tk.Frame):

    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        self.Title_Text = 25
        self.Title_Font = "Courier"
        self.Font = 'Ariel'
        self.Rest_Text = 16
        self.Background_Colour = 'Light blue'

        self.window = parent
        self.window.geometry('1366x768')
        self.window.configure(background = self.Background_Colour)
        self.window.title('Local Languages Learning System')
        #self.window.resizable(width=False, height=False)

        Title1 = tk.Label(self.window, text = 'Local Languages Home Screen', bg = self.Background_Colour)
        Title1.config(font=("Courier", self.Title_Text))
        Title1.pack()
        Title1.place(y = 1, x = 450)

        Question_Label = tk.Label(self.window, text = 'Please Pick The Language You Wish To Learn', bg = self.Background_Colour)
        Question_Label.config(font=(self.Font, self.Rest_Text))
        Question_Label.pack()
        Question_Label.place(y = 200, x = 495)

        Log_Out = tk.Button(self.window, text = 'Log-Out', height = 1, width = 8, command = self.LogOut1)
        Log_Out.pack()
        Log_Out.place(y = 5, x = 1290)

        help_btn = tk.Button(self.window, text = 'Help', height = 1, width = 8, command = None)
        help_btn.pack()
        help_btn.place(y = 45, x = 1290)

        self.English_Flag = tk.PhotoImage(file = 'EnglishFlag.gif')
        self.English_Flag_btn = tk.Button(self.window, image = self.English_Flag, command = self.English_Home_Screen)
        self.English_Flag_btn.pack(side = tk.LEFT, padx = 10)
        self.English_Flag_btn.place(y = 350, x = 300)

        self.Polish_Flag = tk.PhotoImage(file = 'PolishFlag.gif')
        self.Polish_Flag_btn = tk.Button(self.window, image = self.Polish_Flag, command = self.EngFlag)
        self.Polish_Flag_btn.pack(side = tk.LEFT, padx = 10)
        self.Polish_Flag_btn.place(y = 350, x = 600)

        self.Italian_Flag = tk.PhotoImage(file = 'ItalianFlag.gif')
        self.Italian_Flag_btn = tk.Button(self.window, image = self.Italian_Flag, command = None)
        self.Italian_Flag_btn.pack(side = tk.LEFT, padx = 10)
        self.Italian_Flag_btn.place(y = 350, x = 900)

    def English_Home_Screen(self):
        self.Eng_self_window = tk.Toplevel(self.window)
        self.Eng_self_window.geometry('1366x768')
        self.Eng_self_window.configure(background = self.Background_Colour)
        self.Eng_self_window.title('Local Languages Learning System')
        #Eng_self.window.resizable(width=False, height=False)

        Title1 = tk.Label(self.Eng_self_window, text = 'Local Languages\nEnglish Home Screen', bg = self.Background_Colour)
        Title1.config(font=("Courier", self.Title_Text))
        Title1.pack()
        Title1.place(y = 1, x = 450)

        Log_Out = tk.Button(self.Eng_self_window, text = 'Log-Out', height = 1, width = 8, command = self.LogOut1)
        Log_Out.pack()
        Log_Out.place(y = 5, x = 1290)

        Back = tk.Button(self.Eng_self_window, text = 'Back', height = 1, width = 8, command = self.back1)
        Back.pack()
        Back.place(y = 5, x = 1210)

        help_btn = tk.Button(self.Eng_self_window, text = 'Help', height = 1, width = 8, command = None)
        help_btn.pack()
        help_btn.place(y = 45, x = 1290)

        Play_all = tk.Button(self.Eng_self_window, text = 'Play All Games', height = 2, width = 20, command = None)
        Play_all.pack()
        Play_all.place(y = 100, x = 320)

        Multiple_Choice = tk.Button(self.Eng_self_window, text = 'Play Multiple Choice Game', height = 2, width = 20, command = None)
        Multiple_Choice.pack()
        Multiple_Choice.place(y = 100, x = 510)

        Picture = tk.Button(self.Eng_self_window, text = 'Play Picture Game', height = 2, width = 20, command = None)
        Picture.pack()
        Picture.place(y = 100, x = 700)

        Memory = tk.Button(self.Eng_self_window, text = 'Play Memory Game', height = 2, width = 20, command = None)
        Memory.pack()
        Memory.place(y = 100, x = 890)

        LeaderBoard = tk.Button(self.Eng_self_window, text = 'LeaderBoard', height = 2, width = 20, command = None)
        LeaderBoard.pack()
        LeaderBoard.place(y = 160, x = 600)

    def EngFlag(self):
        print('Hello world')

    def LogOut1(self):
        response = messagebox.askquestion ('?', 'Are You Sure?')
        if response == 'yes':
            if tk.Toplevel.winfo_exists(self.Eng_self_window):
                self.Eng_self_window.destroy()
            else:
                self.window.destroy()

    def back1(self):
        print("Go back")
        self.Eng_self_window.destroy()

root = tk.Tk()
Home_Screen(root)
root.mainloop()

快速修复; 。相反,使用 Toplevel 并隐藏和显示 root window。添加:

...
Background_Colour = 'Light blue'

root = Tk()
root.withdraw()
...

并替换:

...
    if response == 'yes':
        try:
         window.destroy()
        except:
         Eng_window.destroy()

...
    global window
    window = Tk()
...
    global Eng_window
    Eng_window = Tk()

与:

...
    if response == 'yes':
        root.destroy()

...
    global window
    window = Toplevel()
...
    global Eng_window
    Eng_window = Toplevel()