我正在尝试创建一个自定义文本输入框,其中间有一个文本输入字段,可以返回用户的输入。我特意尝试制作可以在其他程序中导入和重复使用的东西。我当前的迭代使用了一个“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创建可导入的文本输入模块?
答案 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
包已经完成了所有这些;你可能只想安装和使用它。