2014-10-20 44 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