Комбинация Python Tkinter Button / Entry - PullRequest
0 голосов
/ 20 февраля 2012

Я экспериментировал с 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")

Также обратите внимание, чтоЯ хочу вернуть строку в вызывающую функцию, а не просто сразу ее напечатать.

Я хочу:

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

Ответы [ 3 ]

1 голос
/ 20 февраля 2012

То, что вы просите, для всех намерений и целей невозможно. Функция 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 голосов
/ 20 февраля 2012

По сути, вы хотите, чтобы функция обратного вызова с кнопки была немного более сложной.Вместо того, чтобы просто вызывать метод 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 голосов
/ 20 февраля 2012

в тот момент, когда вы назначаете ButtonA, Cancel, команду root.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()
...