【问题标题】:Python - Tkinter exit button on a child window and how it affects a toggle button statePython - 子窗口上的 Tkinter 退出按钮以及它如何影响切换按钮状态
【发布时间】:2014-10-20 08:29:59
【问题描述】:

我是一名新手,正在尝试使用 Raspberry Pi 学习 Python。我一直在编写一些代码来尝试为板载 piFace 添加一个简单的模拟器。

它存在一些问题,我正在努力解决这些问题。

我的代码会打开一个窗口并显示一个切换按钮,该按钮可以打开/关闭 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()

【问题讨论】:

    标签: python tkinter state exit togglebutton


    【解决方案1】:

    问题的根源在于您在启动子窗口时假设 self.signal = False。我有办法检测 LED 的状态,把它放在这里,问题就会自行解决,即self.signal = get_led_state()

    现在,如果无法获得真正的 LED 状态,那么您需要将该状态存储在其他位置,以便在打开和关闭子窗口之间保留它。一种方法是简单地将signal 字段放入App 类中。但我会这样做:创建一个State 类,它将为我保存 LED 的状态,例如:

    class State:
        LED_ON = true
    

    然后您将控制 State.LED_ON 字段而不是 self.signal 来获取或设置 LED 状态。请注意,它不是线程安全的,但我相信您现在不必担心:)

    【讨论】:

    • 谢谢 - 我有点明白你在说什么,里面有一些新东西让我看看,以及我需要如何实现它们。对我来说,这似乎是切换按钮的状态以及当我关闭窗口时它所处的状态。因为我在“打开”状态下使用切换按钮关闭子窗口,然后再次打开它,在“关闭”状态下使用按钮和图像绘制窗口,两者不匹配。如果我可以检测到切换按钮的状态,那么让子窗口提出正确的状态。我需要试验......
    猜你喜欢
    • 2014-12-14
    • 2014-04-07
    • 2018-08-25
    • 2020-09-20
    • 2016-11-07
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多