Python Tkinter按钮/条目组合

时间:2012-02-20 03:10:54

标签: python button tkinter tkinter-entry

我一直在试验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

3 个答案:

答案 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()