2012-02-20 2 views
0

Я экспериментировал с Tkinter, и у меня есть настройка, где у меня есть окно ввода, а затем под ним две кнопки (Close и OK). Когда клик по щелчку, рамка уничтожается. Я хочу, чтобы он возвращал все, что есть в поле ввода, а затем уничтожает фрейм. Я просто не понимаю, как это сделать.Python Tkinter Button/Entry combination

Это часть того, что у меня есть (где 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 
+0

«возврат» не имеет смысла в контексте программы, управляемой событиями. Где вы ожидаете вернуть стоимость? –

+0

Я добавил еще немного кода, чтобы, надеюсь, очистить ваше замешательство. –

ответ

1

Что вы спрашиваете, для всех намерений и целей, невозможно. Функция DoThis вернется, пока графический интерфейс даже не отобразится на экране.

Это, как говорится, такое возможно, но очень необычно. Это немного похоже на то, как вы можете вытащить тюк сена через грязное поле в Ferrari.

Если вы только планируете выскакивать окно один раз, вы можете получить что-то вроде следующего:

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 предназначен для использования.

+0

Редактируя немного кода, мне удалось вернуть его прямо, вместо того, чтобы просто установить глобальную переменную равную ей. В любом случае, вы очень помогли, так что большое спасибо! –

0

в данный момент вы присваиваете ButtonA, Отмена команды root.destroy. Вместо прямого вызова функции destroy создайте отдельную функцию, которая считывает значение, а затем вызывает destroy.

Я обычно обернуть это в классе кадров, чтобы сделать его немного легче:

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() 
+0

Проблема в том, что я хочу, чтобы он возвращал значение, и если я просто изменил ваш 'print self.v.get()' to 'return self.v.get()', он вернет его в '__init__', а не к основному классу. –

0

В принципе, вы хотите, чтобы ваша функция обратного вызова с помощью кнопки, чтобы быть немного более сложным. Вместо того, чтобы просто вызвать метод destroy, вы хотите вызвать свою собственную функцию. Используйте метод get в объекте Entry для извлечения содержимого.

Надеется, что это достаточно сложный примера, чтобы вы собираетесь:

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() 
+0

Проблема в том, что я хочу, чтобы он ВОЗВРАЩАЛ значение, а не печатал его. Если бы я просто изменил инструкции 'print' в вашем коде на' return', тогда он просто вернет его в 'display_button_entry', а не в основной класс. –

+0

Мне нужно будет увидеть больше вашего кода, но я думаю, вы пытаетесь сделать что-то не так. Вы не должны использовать кнопки для возврата значений. – jgritty