如何在单击按钮时仅创建一个新窗口?特金特

2024-06-02 08:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想制作一个按钮,当点击时打开一个新窗口(tk.toplevel),有没有办法使按钮只工作一次(此后点击时只生成一个新窗口,而点击时的按钮不起任何作用)

从下面的代码中,我可以通过单击按钮来创建无限数量的顶层,但我只希望它在单击时创建一个顶层

import tkinter as tk

class run:      # pls ignore if there are any syntrax error/spelling because I typed this in stack overflow
    def __init___(self, master)
        button = tk.button(master, text="btn", self.command=make_new)
        button.grid()
    def make_new()
        new = tk.toplevel(master)

master1 = tk.Tk()
i = Run(master1)
master1.mainloop()

***我没有把原始代码放在这里,因为它有太多的类/函数要放在这里

***这是我提出的另一个问题,其中包含更多代码:How to make a tkinter button open only one Toplevel?


Tags: 代码selfmasternew数量maketkinterdef
2条回答

这里的问题是:“循环”迭代对于人的反应来说太快了,一个动作在多次迭代中仍然是活动的

可行的解决方案/提示#1

是否可以在denew = tk.toplevel(master)之后添加wait(miliSeconds)(或类似函数)?我在Arduino上也遇到了同样的问题,但这是因为“循环”太快了,无法让人做出反应,所以在打开新窗口后,您可能需要添加一点“等待”(可能是半秒或1秒),因此您只有一个新窗口

可行的解决方案/提示#2

如果无法添加wait(miliSeconds)函数,可以尝试向main方法添加标志,当您输入make_new()方法时,询问flag == 0如果是,将其转换为1并继续,如果标志不是0,只需跳过打开新窗口即可

我对您的代码进行了一些更改,因此当您单击按钮时,它将创建一个顶级,如果您多次单击,它将不会创建更多的顶级:

import tkinter as tk


class Run:
    def __init__(self, master):
        self.master = master
        self.toplevels = 0
        button = tk.Button(master, text="btn", command=self.make_new)
        button.pack()

    def make_new(self):
        if not self.toplevels:
            new = tk.Toplevel(self.master)
            self.toplevels += 1

master1 = tk.Tk()
i = Run(master1)
master1.mainloop()

相关问题 更多 >