2014-10-20 83 views
0

我是一名試圖通過Raspberry Pi學習Python的新手。我一直在編寫一些代碼來嘗試爲piFace添加一個簡單的模擬器。Python - 兒童窗口上的Tkinter退出按鈕及其如何影響切換按鈕狀態

有幾個問題,我正在學習,因爲我工作的方式通過他們。

我的代碼打開一個窗口並顯示一個切換按鈕,用於打開/關閉LED圖像的切換。我還添加了一個打開子窗口的按鈕。子窗口有兩個按鈕。一個是打開/關閉切換按鈕,用於打開/關閉LED圖像,另一個是退出按鈕。

我的問題是,如果我使用「退出」按鈕時LED處於「打開」狀態,則子窗口會關閉,因爲它應該如此。但是,如果我重新打開子窗口並使用切換按鈕打開LED,則沒有任何反應。如果我再次按下切換按鈕,LED就會亮起。

我有點理解問題所在。因爲我在LED打開時關閉子窗口,所以切換按鈕狀態仍處於開啓狀態。而且,當我重新打開窗口並單擊切換按鈕時,我只是將切換按鈕狀態設置爲OFF。

我不知道如何解決這個問題。我應該關注一下另一種可能正確的方式嗎?我應該在每次打開子窗口時查看預置切換開關狀態的方法嗎?我應該嘗試完全不同的東西嗎?我應該完全停止嗎? :-)

我希望這是有道理的。

感謝您的任何幫助。

這裏是我的代碼....

# Idle 10_01_2014_GUI label image toggle 
from time import sleep 
from Tkinter import * 
import Tkinter as tk 
import threading 

class App: 

    def __init__(self, master): 
      self.master=master 
      frame = Frame(master) 
      frame.pack() 
      Label(frame, text='Turn LED ON').grid(row=0, column=0) 
      Label(frame, text='Turn LED OFF').grid(row=0, column=1) 

      self.button0 = Button(frame, text='LED 0 OFF', command=self.convert0) 
      self.button0.grid(row=2, column=0) 
      self.LED0 = Label(frame, image=logo2) 
      self.LED0.grid(row=2, column=1) 

      self.buttonnewwindow = Button(frame, text='Knight Rider TEST', command=self.new_window) 
      self.buttonnewwindow.grid(row=10, column=0) 

      self.button8 = Button(frame, text='Exit', command=quit) 
      self.button8.grid(row=11, column=0) 

    def convert0(self, tog=[0]): 

     tog[0] = not tog[0] 
     if tog[0]: 
      print('LED 0 ON') 
      self.button0.config(text='LED 0 ON') 
      self.LED0.config(image = logo) 
      self.LED0.grid(row=2, column=1) 

     else: 
      print('LED 0 OFF') 
      self.button0.config(text='LED 0 OFF') 
      self.LED0.config(image = logo2) 
      self.LED0.grid(row=2, column=1) 


    def new_window(self): 
     print('New Window') 
     self.newWindow = tk.Toplevel(self.master) 
     self.app = App2(self.newWindow) 
     self.newWindow.grab_set() # I added this line to stop opening multiple new windows 

class App2: 

    def __init__(self, master): 
      self.signal = False  
      print('self.signal', self.signal) 
      self.master=master # I added this line to make the exit button work 
      frame = Frame(master) 
      frame.pack() 
      Label(frame, text='Turn LED ON').grid(row=0, column=0) 
      Label(frame, text='Turn LED OFF').grid(row=0, column=1) 

      self.button0 = Button(frame, text='Knight Rider OFF', command=self.convert0) 
      self.button0.grid(row=2, column=0) 
      self.LED0 = Label(frame, image=logo2) 
      self.LED0.grid(row=2, column=1) 

      self.button9 = Button(frame, text='Exit', command=self.close_window) 
      self.button9.grid(row=3, column=0) 


    def convert0(self, tog=[0]): 

     tog[0] = not tog[0] 

     if tog[0]: 
      print('Knight Rider ON') 
      self.button0.config(text='Knight Rider ON') 
      self.signal = True 
      print('self.signal', self.signal) 
      print('tog[0]', tog[0]) 
      self.LED0.config(image = logo) 
     else: 
      print('Knight Rider OFF') 
      self.button0.config(text='Knight Rider OFF') 
      self.signal = False 
      print('self.signal', self.signal) 
      print('tog[0]', tog[0]) 
      self.LED0.config(image = logo2) 


    def close_window(self): 
      print('Knight Rider OFF') 
      print('self.signal', self.signal) 
      self.button0.config(text='Knight Rider OFF') 
      self.LED0.config(image = logo2) 
      self.signal = False 
      print('self.signal', self.signal) 

      sleep(.5) 
      print('Close Child window') 
      self.master.destroy() # I added this line to make the exit button work 

root = Tk() 
logo2 = PhotoImage(file="c:\\Users\\joebloggs\\Downloads\\led-off.gif") 
logo = PhotoImage(file="c:\\Users\\joebloggs\\Downloads\\led-on.gif") 

root.wm_title('LED on & off program') 
app = App(root) 

root.mainloop() 

回答

0

來自您啓動子窗口假設 self.signal = False的事實,問題的根源。我有一種檢測LED狀態的方法,把它放在這裏,問題就會解決,即self.signal = get_led_state()

現在,如果無法獲得真正的LED狀態,那麼您需要將該狀態存儲在其他位置,以便在打開和關閉子窗口之間保留該狀態。一種方法是簡單地將signal字段放入App類。不過,我會去如下:創建State類,其將持有的LED狀態對我,例如:

class State: 
    LED_ON = true 

然後將控制而不是self.signalState.LED_ON領域獲取或設置LED狀態。請注意,它不是線程安全的,但我相信你現在不必擔心:)

+0

謝謝 - 我有點得到你在說什麼,還有一些新的東西在那裏給我看在,以及我需要如何實施它們。對我來說,它似乎是切換按鈕的狀態,以及當我關閉窗口時它處於哪種狀態。因爲我用'開'狀態下的切換按鈕關閉了子窗口,然後再次重新打開它,並使用按鈕和圖像在'關'狀態下繪製窗口,兩者不匹配。如果我可以檢測到切換按鈕的狀態,那麼讓子窗口呈現正確的狀態。我需要試驗.... – 2014-10-20 10:01:08