Ich habe den folgenden Code, der eine Farb- / Textänderung verursacht, wenn auf eine Tkinter-Schaltfläche geklickt wird. Ich möchte zur ursprünglichen Farbe / zum ursprünglichen Text zurückkehren, wenn die Schaltfläche ein zweites Mal angeklickt wird.

from Tkinter import *

window = Tk()
window.title("Start/Stop Button")
window.geometry('200x100')

def clicked_rf1():
    btn_rf1.configure(text="Stop")
    lbl_rf1.configure(text="  ON  ", bg="green")

btn_rf1 = Button(window, text="Start", command=clicked_rf1)
btn_rf1.grid(column=1, row=1)
lbl_rf1 = Label(window, text="  OFF ", bg="red")
lbl_rf1.grid(column=2, row=1)

window.mainloop()

Ich möchte etwas, das sich ein bisschen mehr wie ein Umschalter verhält, aber ich möchte das Aussehen eines Knopfes.

Hilfe dankbar erhalten.

2
Christina 19 Apr. 2018 im 00:14

3 Antworten

Beste Antwort

Sie benötigen einen if-Block, um auszuwählen, was zu tun ist. Sie können eine andere Flag-Variable erstellen, um den Status zu verfolgen, oder einfach den aktuellen Beschriftungs- oder Schaltflächentext verwenden:

from Tkinter import *

window = Tk()
window.title("Start/Stop Button")
window.geometry('200x100')

def clicked_rf1():
    if btn_rf1['text'] == "Start":
        btn_rf1.configure(text="Stop")
        lbl_rf1.configure(text="  ON  ", bg="green")
    else:
        btn_rf1.configure(text="Start")
        lbl_rf1.configure(text="  OFF ", bg="red")

btn_rf1 = Button(window, text="Start", command=clicked_rf1)
btn_rf1.grid(column=1, row=1)
lbl_rf1 = Label(window, text="  OFF ", bg="red")
lbl_rf1.grid(column=2, row=1)

window.mainloop()

Dies wäre ein idealer Ort, um eine benutzerdefinierte Button-Unterklasse zu erstellen, sodass Sie viele davon in Ihrem Programm haben könnten:

from Tkinter import *

window = Tk()
window.title("Start/Stop Button")
window.geometry('200x100')

class Christina(Frame):
    def __init__(self, master=None, **kwargs):
        Frame.__init__(self, master, **kwargs)

        self.btn = Button(self, text="Start", command=self.clicked)
        self.btn.grid(column=0, row=0)
        self.lbl = Label(self, text="  OFF ", bg="red")
        self.lbl.grid(column=1, row=0)

    def clicked(self):
        if self.btn['text'] == "Start":
            self.btn.configure(text="Stop")
            self.lbl.configure(text="  ON  ", bg="green")
        else:
            self.btn.configure(text="Start")
            self.lbl.configure(text="  OFF ", bg="red")

btn1 = Christina(window)
btn1.grid()
btn2 = Christina(window)
btn2.grid()
btn3 = Christina(window)
btn3.grid()

window.mainloop()
4
Novel 18 Apr. 2018 im 21:28

Ein anderer Ansatz könnte darin bestehen, den "Codestapel" in eine andere Funktion zu stecken, diese in einem Iterator zu sammeln und dann die Funktion next von diesem Iterator abzurufen und auszuführen:

def bunchofcode():
    print("foo")

def somethingelse():
    print("bar")

whattodo = iter([bunchofcode, somethingelse])

def clicked_rf1():
    try:
        next(whattodo)()
    except StopIteration:
        print("nothing to do")

Oder für zyklisches Verhalten:

from itertools import cycle
whattodo = cycle([bunchofcode, somethingelse])

Für eine Umschalttaste mit zwei Status können Sie auch ein dict verwenden, um den aktuellen Status dem nächsten zuzuordnen. Sie können auch den relief der Schaltfläche verwenden, um den Status zu markieren.

def clicked_rf1():
    transition = {"raised": "sunken", "sunken": "raised"}
    btn_rf1["relief"] = transition[btn_rf1["relief"]]
2
tobias_k 18 Apr. 2018 im 21:28

Wenn Sie umschalten möchten, können Sie das Kontrollkästchen ohne Anzeige verwenden. Es verfügt über Optionen für die Farbe im ausgewählten und nicht ausgewählten Status. Sie können den Wert und die Beschriftung miteinander verknüpfen, sodass sich die Beschriftung ändert, wenn Sie die Schaltfläche umschalten.

Wie bei jeder Schaltfläche können Sie einen Befehl damit verknüpfen. Der Befehl kann den Wert der Variablen überprüfen, um festzustellen, ob die Funktion "Ein" oder "Aus" ausgeführt werden soll.

Hier ist ein einfaches Beispiel:

import Tkinter as tk

def toggle():
    if var.get() == "ON":
        print("turning on...")
    else:
        print("turning off...")

root = tk.Tk()
var = tk.StringVar()
toggle = tk.Checkbutton(root, onvalue="ON", offvalue="OFF", width=4,
                        indicatoron=False, 
                        variable=var, textvariable=var,
                        selectcolor="green", background="red",
                        command=toggle)

var.set("OFF")
toggle.pack()

root.mainloop()
3
Bryan Oakley 18 Apr. 2018 im 22:19