如何自动激活tkinter simpledialog弹出窗口?

2024-05-16 05:12:48 发布

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

我在我的一个python脚本中有这个函数,它会弹出一个Tkinter简单对话框屏幕,请求一些简单的用户输入。功能正常。但是,它有两个问题。在

  1. 它打开了两扇窗户,而我只需要一扇。但是如果我删除master=Tk()我会得到错误:

AttributeError: 'NoneType' object has no attribute 'winfo_viewable'

如果能在某一点上找出这一点是很好的,但我的主要问题是第二个问题:

  1. 每当简单的对话屏幕出现时,我必须先点击它才能激活,这很烦人。为了解决这个问题,我尝试了here和{a2}提供的解决方案,但它们都不起作用。第一个环节对我没有任何帮助,第二个环节帮助我提升了大师。Tk()窗户朝前,但那不是我需要的。我需要一个简单的对话框窗口成为最上面的窗口,我需要它是自动激活的,这样当我运行我的代码和屏幕弹出时,我可以自动输入,而不必先点击它。在

任何帮助将不胜感激!在

我的代码:

def getUser():
    master = Tk()
    newList2=str(newList).replace(", ","\n")
    for ch in ['[',']',"'"]:
        if ch in newList2:
            newList5=newList2.replace(ch,"")
    userNr=simpledialog.askinteger("Enter user number", newList2)
    chosenUsernr= userNr - 1
    global chosenUsernrdef
    chosenUsernrdef = chosenUsernr
    master.destroy()

Tags: 代码inmaster脚本屏幕chreplacetk
2条回答

我不认为有什么方法可以提升/集中注意力,但是askinteger只是几个小部件的组合,因此您可以轻松地自己重新创建它。在

import tkinter as tk
from tkinter import messagebox

class CustomAskInteger(tk.Tk):
    def __init__(self,  numbers):
        tk.Tk.__init__(self)

        self.value = None
        self.label = tk.Label(self, text=", ".join(map(str, numbers))).pack(fill="both", expand=True)
        self.entry = tk.Entry(self)
        self.button = tk.Button(self, text="Ok", command=self.get_number)

        self.entry.pack()
        self.button.pack()

    def get_number(self):
        """
        You can customize these error handlings as you like to
        """
        if self.entry.get():
            try:
                int(self.entry.get())
                self.value = self.entry.get()
                self.destroy()
            except ValueError:
                messagebox.showwarning("Illegal Value", "Not an integer.\nPlease try again.")
        else:
            messagebox.showwarning("Illegal Value", "Not an integer.\nPlease try again.")

要在代码中使用它,可以

^{pr2}$

首先,感谢Lafexlos展示了如何在Tkinter上应用.lift()和类似命令的解决方案simpledialog.askinteger()窗口,方法是将此类窗口重新创建为Tk()实例。在

然而,对于那些想要自动激活一个Tk窗口的人来说(这样你就不必点击它就可以输入了),这里似乎有多个选项。在

最常见的解决方案似乎是使用.focus()或{},如图所示,here和{a2}。然而在here上,这些选项似乎在(至少是某些版本的)Windows操作系统上不起作用。This问题显示了这些系统的可能解决方案。另外,以前的解决方案似乎不能在多个版本的osx上运行。基于提供的解决方案here,使用苹果的osascript,我能够解决我的问题。在

工作代码最终如下所示:

def getUser():
    master = Tk()
    newList2=str(newList).replace(", ","\n")
    for ch in ['[',']',"'"]:
        if ch in newList2:
            newList2=newList2.replace(ch,"")
    cmd = """osascript -e 'tell app "Finder" to set frontmost of process "Python" to true'"""
    def stupidtrick():
        os.system(cmd)
        master.withdraw()
        userNr=simpledialog.askinteger("Enter user number", newList2)
        global chosenUsernrdef
        chosenUsernr= userNr - 1
        chosenUsernrdef = chosenUsernr
    stupidtrick()
    master.destroy()

简化/通用解决方案:

^{pr2}$

编辑:现在我在想办法寻找解决方案似乎已经被多个帖子找到了。{tx和tx的多个实例同时运行时,{tx和kinter可能希望同时激活一个特定的窗口。在

相关问题 更多 >