Python tkinter:他为什么要辞职?

Python tkinter: why does he want to quit?

我正在编写的代码需要一些帮助...虽然当我开始编写代码时直接出现 window 问我是否要关闭它。

有谁知道这可能来自哪里?

代码应该打开一个 window,我有一些按钮可以打开其他一些 windows,带有滑块来控制 DMX 灯。

代码如下:

import tkinter as tk
from tkinter import ttk
from tkinter import *
from print_dict import pd
from time import sleep
from tkinter import messagebox

Pultdatas = {'DMXtype':512,
             'columns':2,
             'rows':8,
             'slider':8,
             'modes':4
             }

root = Tk()
root.configure(background='gray')
root.title('DMX-Pult v2')

Screens = {'mainscreen':[root,{}]}

def on_closing(screen):
    if messagebox.askokcancel("Quit", f"Do you want to quit Scanner {screen}?"):
        Screens[screen][0].destroy()

def setmode(screen,mode):
    print(f'setmode on screen {screen} to {mode}')
    for i in Screens[screen][1]['modesel']:
        print(i)
        i.config(bg='gray')
    Screens[screen][1]['modesel'][mode].config(bg='green')

def pressed(btn):
    print('pressed Button: ' + str(btn))
    if not Screens.__contains__(btn):
        Screens[btn] = []
        Screens[btn].append(Tk())
        Screens[btn][0].configure(background='gray')
        Screens[btn][0].title(f'Scanner {btn}')
        Screens[btn].append({})

        Screens[btn][1]['modesel'] = []
        for i in range(Pultdatas['modes']):
            Screens[btn][1]['modesel'].append(Button(Screens[btn][0], text=f"mode {i+1}", bg='gray', fg='white', command=lambda name = i:setmode(btn,name)))
            Screens[btn][1]['modesel'][i].grid(row=i,column=0)
        setmode(btn,0)


    else:
        if Screens[btn][0].winfo_exists() == 1:
            sleep(0.2)
            print('This window exist.')
            Screens[btn][0].attributes('-topmost', True)
            Screens[btn][0].update()
            Screens[btn][0].attributes('-topmost', False)
        else:
            Screens[btn] = []
            Screens[btn].append(Tk())
            Screens[btn][0].configure(background='gray')
            Screens[btn][0].title(f'Scanner {btn}')
            Screens[btn].append({})

            Screens[btn][1]['modesel'] = []
            for i in range(Pultdatas['modes']):
                Screens[btn][1]['modesel'].append(Button(Screens[btn][0], text=f"mode {i + 1}", bg='gray', fg='white',
                                                         command=lambda name=i: setmode(btn, name)))
                Screens[btn][1]['modesel'][i].grid(row=i, column=0)

            Screens[btn][0].protocol("WM_DELETE_WINDOW", lambda name = btn:on_closing(name))
            setmode(btn, 0)

    print()

def close():
    if messagebox.askokcancel("Quit", f"Do you want to quit?"):
        for screen in Screens:
            print(f'closed {Screens[screen][0].title()} Succesfully')
            Screens[screen][0].destroy()




tmpint = 0
Screens['mainscreen'][1]['Back'] = Button(root, text='close all',bg='gray',fg='white',command=close)
Screens['mainscreen'][1]['Back'].grid(row=0,column=0)
for column in range(Pultdatas['columns']):
    for row in range(Pultdatas['rows']):
        tmpint += 1
        Screens['mainscreen'][1][tmpint] = Button(root, text=f"Scanner {tmpint}", bg='gray', fg='white', command=lambda name = tmpint:pressed(name))
        Screens['mainscreen'][1][tmpint].grid(row=row+1,column=column)

pd(Screens)

root.protocol("WM_DELETE_WINDOW", close())
root.mainloop()

你可以只更改这行代码

root.protocol("WM_DELETE_WINDOW", close())

为此:

root.protocol("WM_DELETE_WINDOW", close)

你不需要写(),我们可以只写handler not as function。 欲了解更多信息,您可以访问 here