我一直在试验Tkinter,我有一个设置,我有一个输入框,然后在它下面有两个按钮(关闭和确定)。单击关闭时,框架将被销毁。我想让它返回当时输入框中的任何内容然后销毁框架。我对如何做到这一点感到茫然。
这是我所拥有的一部分(f
是我的框架):
class App:
def DoThis(self):
#Earlier code that's not related to the question
v=StringVar()
e=Entry(f,textvariable=v)
buttonA=Button(f,text="Cancel",command=root.destroy)
buttonB=Button(f,text="OK")
另外,请注意我想将字符串RETURN到调用函数,而不是立即打印它。
我想:
print App().DoThis() #to print what was in the entry box
#at the time of OK being clicked
答案 0 :(得分:1)
你要问的是,出于所有意图和目的,这是不可能的。在GUI甚至显示在屏幕上之前,函数DoThis
将返回。
话虽这么说,这样的事情是可能的,尽管很不寻常。这有点像问你怎么能在法拉利的泥泞地里拖着一捆干草。
如果您只打算弹出一次窗口,可以使用以下内容:
import Tkinter as tk
class MyApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.entry = tk.Entry(self)
self.entry.pack()
close_button = tk.Button(self, text="Close", command=self.close)
close_button.pack()
self.string = ""
def close(self):
global result
self.string = self.entry.get()
self.destroy()
def mainloop(self):
tk.Tk.mainloop(self)
return self.string
print "enter a string in the GUI"
app = MyApp()
result = app.mainloop()
print "you entered:", result
如果你打算不止一次打开窗户,你可能不会有太多运气,因为这不仅仅是Tkinter的使用方式。
答案 1 :(得分:0)
当你将ButtonA,Cancel,命令分配给root.destroy时。不是直接调用destroy函数,而是创建一个单独的函数来读取值,然后调用destroy。
我通常将它包装在Frame类中以使其更容易:
import Tkinter
class Frame(Tkinter.Frame):
def __init__(self, root=None):
self.root = root
Tkinter.Frame.__init__(self, root)
# Create widgets
self.v = StringVar()
self.e = Entry(self, textvariable=v)
self.buttonA = Button(self, text="Cancel", command=cancel)
self.buttonB = Button(self, text="OK")
def cancel(self):
print self.v.get() # handle value here
self.root.destroy()
答案 2 :(得分:0)
基本上,您希望按钮的回调函数更复杂一些。而不是简单地调用destroy方法,你将需要调用自己的函数。使用Entry对象上的get方法来检索内容。
希望这是一个足以让你前进的完整例子:
import Tkinter as tk
class App:
def __init__(self, master):
self.display_button_entry(master)
def setup_window(self, master):
self.f = tk.Frame(master, height=480, width=640, padx=10, pady=12)
self.f.pack_propagate(0)
def display_button_entry(self, master):
self.setup_window(master)
v = tk.StringVar()
self.e = tk.Entry(self.f, textvariable=v)
buttonA = tk.Button(self.f, text="Cancel", command=self.cancelbutton)
buttonB = tk.Button(self.f, text="OK", command=self.okbutton)
self.e.pack()
buttonA.pack()
buttonB.pack()
self.f.pack()
def cancelbutton(self):
print self.e.get()
self.f.destroy()
def okbutton(self):
print self.e.get()
def main():
root = tk.Tk()
root.title('ButtonEntryCombo')
root.resizable(width=tk.NO, height=tk.NO)
app = App(root)
root.mainloop()
main()