导入期间Python Tkinter自定义msgbox失败

时间:2017-05-04 22:49:02

标签: python tkinter import

我正在尝试创建一个自定义文本输入框,其中间有一个文本输入字段,可以返回用户的输入。我特意尝试制作可以在其他程序中导入和重复使用的东西。我当前的迭代使用了一个“inputdialog”类,当它在自己的.py文件中时可以正常工作,但是如果我尝试将模块导入到另一个脚本中,那么“ok”按钮看起来什么都不做,而且“x” “按钮抛出”ImportError:关闭弹出窗口后无法导入名称'inputdialog'“错误。

以下是我的代码,如果作为独立脚本运行,目前可以使用:

from tkinter import *

class inputdialog:
    def __init__(self):
        self.value = None
        self.root = Tk()
        self.root.withdraw()
        self.top = Toplevel(self.root)


        Label(self.top, text="Value").pack()
        self.e = Entry(self.top)
        self.e.pack(padx=5)

        b = Button(self.top, text="OK", command=self.ok)
        b.pack(pady=5, padx=5, side="right")
        self.root.mainloop()

    def ok(self):
        self.value = self.e.get()
        self.root.destroy()

if __name__ == "__main__":
    test = inputdialog()
    print(test.value)

以下是我将此模块导入另一个程序的方法,该程序目前无效:

if __name__ == "__main__":
    # These two lines below are needed to make sure that "askopenfilename"
    # doesn't show it's top level tkinter window
    root = Tk()
    root.withdraw()
    entdbemp = askopenfilename(title="Please select a file: ")

    # Here is my non-working module call
    master = inputdialog()
    print(master.value)

为什么我的“确定”按钮在导入时会停止运行?有什么办法可以修改我的代码以允许它导入吗?有没有更好的方法尝试使用tkinter创建可导入的文本输入模块?

1 个答案:

答案 0 :(得分:2)

问题与导入无关。问题是,在第二个示例中,您调用Tk()两次:每个文件一次。此外,当你致电'销毁'你只是从屏幕上删除GUI,你没有退出主循环。

要使其工作,您需要删除在inputdialog类中创建根的行,在启动类后将mainloop()调用移动到某个点,然后调用quit方法顶层窗口(不是根窗口):

from tkinter import *
class inputdialog:
    def __init__(self, master=None):
        self.value = None
        self.top = Toplevel(master)

        Label(self.top, text="Value").pack()
        self.e = Entry(self.top)
        self.e.pack(padx=5)

        b = Button(self.top, text="OK", command=self.ok)
        b.pack(pady=5, padx=5, side="right")

    def ok(self):
        self.value = self.e.get()
        self.top.quit()

if __name__ == "__main__":
    root = Tk()
    root.withdraw()
    master = inputdialog(root)
    root.mainloop()
    print(master.value)

如果你想要整洁和正确:而不是创建一个包含不同类的类,在OOP和GUI中我们喜欢创建一个子类:

import tkinter as tk

class inputdialog(tk.Toplevel):
    def __init__(self, master=None):
        tk.Toplevel.__init__(self, master)

        self.value = None

        tk.Label(self, text="Value").pack()
        self.e = tk.Entry(self)
        self.e.pack(padx=5)

        b = tk.Button(self, text="OK", command=self.ok)
        b.pack(pady=5, padx=5, side="right")

    def ok(self):
        self.value = self.e.get()
        self.quit()

if __name__ == "__main__":
    root = tk.Tk()
    root.withdraw()
    master = inputdialog(root)
    root.mainloop()
    print(master.value)

此外,通配符导入(from module import *)是丑陋的,而且是针对PEP8的;不要使用它们。

BTW,easygui包已经完成了所有这些;你可能只想安装和使用它。