0

私はTkinterを試してきましたが、入力ボックスがあり、その下に2つのボタン([閉じる]と[OK])があるセットアップがあります。[閉じる]をクリックすると、フレームが破棄されます。その時点で入力ボックスにあるものをすべて返してから、フレームを破棄してほしい。私はこれをどのように行うか途方に暮れています。

これは私が持っているものの一部です(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")

また、文字列をすぐに出力するのではなく、呼び出し元の関数に返したいことに注意してください。

が欲しいです:

print App().DoThis() #to print what was in the entry box
#at the time of OK being clicked
4

3 に答える 3

1

あなたが求めることは、すべての意図と目的のために、不可能です。DoThisGUIが画面に表示される前に、関数が戻ります。

そうは言っても、非常に珍しいことですが、そのようなことは可能です。それは、フェラーリの泥だらけの畑を横切って干し草のベールを運ぶ方法を尋ねるのと少し似ています。

ウィンドウを一度ポップアップするだけの場合は、次のような方法で解決できます。

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が使用されるように設計されている方法ではないためです。

于 2012-02-20T16:06:56.997 に答える
0

ButtonA、キャンセル、コマンドを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()
于 2012-02-20T06:49:24.573 に答える
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()
于 2012-02-20T06:59:47.647 に答える