Пауза для события в python tkinter

Я использую графический интерфейс tkinter python 2.7 на Raspberry Pi для автоматизации тестирования некоторых материалов. Для тестирования необходимо протестировать несколько образцов, и для замены образцов требуется время. Я хочу вывести текст, говорящий что-то вроде «Пожалуйста, вставьте образец, затем нажмите клавишу ввода на клавиатуре» и приостановите функцию до тех пор, пока не будет нажата клавиша ввода. Вместо нажатия клавиши ввода я также мог бы использовать кнопку tkinter. Есть идеи без использования внешних библиотек? Я пробовал цикл while, в котором я пытаюсь выйти из цикла после нажатия кнопки, но поскольку цикл запущен, кнопка не регистрируется.

Пример кода (удалено много кода и оставлено то, что актуально):

class App:
def __init__(self,master):

    #self.WILTRON = Wiltron_54128A_GPIB()

    self.var = tk.StringVar()
    self.var.trace("w",self.getTest)

    self.okbutton = tk.IntVar()
    self.okbutton.trace("w",self.OKbutton)

    frame = Frame(master)
    frame.pack()

    #Initial GUI values
    self.var.set('Choose Test')
    testChoices = ['TEST']
    App.testOption = tk.OptionMenu(frame, self.var, *testChoices)
    App.testOption.grid(row=0, column=0)
    okButton = tk.Button(frame, text="     OK    ", command=self.OKbutton).grid(row=2, column=1)

#Test routine functions
def getTest(self, *args):
    test = self.var.get()
    sf = "IC Network Analyzer"
    root.title(sf)

    #####
    if test == "TEST":
        sample1 = self.WILTRON.Sample_Data()
        print 'Change out sample then press OK'
        #This is where I need to pause until the next sample has been inserted
        sample2 = self.WILTRON.Sample_Data()
        #ect.
    #####

def OKbutton(self):
    #Whatever I need to do to make the button exit the pause

person Brett Prudhom    schedule 19.06.2014    source источник
comment
Есть десятки способов сделать это. Если вы можете опубликовать какой-то код, возможно, образец функции тестирования, вам будет легче посоветовать. Например, вы используете классы для создания своего графического интерфейса или какую-то глобальную систему переменных?   -  person Brionius    schedule 20.06.2014
comment
Привет, @Brionius, я отредактировал свой исходный пост, включив в него соответствующий код. Спасибо за ваш ответ!   -  person Brett Prudhom    schedule 20.06.2014


Ответы (2)


Используйте tkMessageBox

import Tkinter
import tkMessageBox

print "Sample #1"
tkMessageBox.showinfo("Message", "Insert sample and press OK")
print "Sample #2"
person furas    schedule 19.06.2014
comment
Потрясающе, спасибо! Мне это решение нравится даже больше, чем то, что я себе представлял. - person Brett Prudhom; 20.06.2014

Вот рабочий пример, который использует обратный вызов для запуска теста и обратный вызов для продвижения каждого образца.

import Tkinter as tk

class App:
    def __init__(self, master):
        self.master = root
        self.frame = tk.Frame(self.master)

        self.okLabel = tk.Label(self.frame, text="Change out sample then press OK")
        self.okButton = tk.Button(self.frame, text="     OK    ", command=self.nextSample)

        self.var = tk.StringVar()
        self.var.set('Choose Test')
        self.var.trace("w",self.beginTest)
        testChoices = ['TEST']
        self.testOption = tk.OptionMenu(self.frame, self.var, *testChoices)

        self.sampleNumber = 1
        self.maxSamples = 5
        self.testing = False
        self.samples = []

        self.updateGUI()

    def testSample(self):
        # Do whatever you need to do to test your sample
        pass

    def beginTest(self, *args):   # This is called when the user clicks the OptionMenu to begin the test
        self.testing = True

        sf = "IC Network Analyzer"
        self.master.title(sf)

        self.testOption.config(state=tk.DISABLED)
        self.okButton.config(state=tk.NORMAL)
        self.okLabel.config(text="Ready first sample, then press OK")
        self.updateGUI()

    def nextSample(self):         # This is called each time a new sample is tested.
        if self.sampleNumber >= self.maxSamples:  # If the maximum # of samples has been reached, end the test sequence
            self.testing = False
            self.sampleNumber = 1
            self.testOption.config(state=tk.NORMAL)
            self.okButton.config(state=tk.DISABLED)

            # You'll want to save your sample data to a file or something here

            self.samples = []

            self.updateGUI()
        else:
            self.sampleNumber += 1
            if self.var.get() == "TEST":
                self.samples.append(self.WILTRON.Sample_Data())
                self.okLabel.config(text="Switch to sample #"+str(self.sampleNumber)+" and press OK")
                #At this point, the GUI will wait politely for you to push the okButton, before it runs this method again.
                #ect.
            #####

    def updateGUI(self):
        self.frame.grid()
        self.testOption.grid(row=1, column=1)
        if self.testing:
            self.okLabel.grid(row=2, column=1)
            self.okButton.grid(row=3, column=1)
        else:
            self.okLabel.grid_remove()
            self.okButton.grid_remove()
        self.master.update_idletasks()

root = tk.Tk()
a = App(root)
root.mainloop()
person Brionius    schedule 20.06.2014