Python 如何在两种状态下使用Tkinter按钮?
我有以下代码,当点击Tkinter按钮时,会导致颜色/文本更改。第二次单击按钮时,我想还原为原始颜色/文本Python 如何在两种状态下使用Tkinter按钮?,python,button,tkinter,Python,Button,Tkinter,我有以下代码,当点击Tkinter按钮时,会导致颜色/文本更改。第二次单击按钮时,我想还原为原始颜色/文本 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="gr
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()
我想要的东西的行为更像一个切换,但我想一个按钮的外观
感谢您的帮助。您需要一个if块来选择要执行的操作。您可以创建另一个标志变量来跟踪状态,或者只使用当前标签或按钮文本:
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()
这将是创建自定义按钮子类的理想位置,因此您的程序中可以有许多这样的子类:
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()
另一种方法可能是将“代码堆”放入不同的函数中,在迭代器中收集这些代码,然后从迭代器中获取
next
函数并执行它:
def bunchofcode():
print("foo")
def somethingelse():
print("bar")
whattodo = iter([bunchofcode, somethingelse])
def clicked_rf1():
try:
next(whattodo)()
except StopIteration:
print("nothing to do")
或对于循环行为:
from itertools import cycle
whattodo = cycle([bunchofcode, somethingelse])
对于双状态切换按钮,还可以使用
dict
将当前状态映射到下一个状态。您还可以使用按钮的relief
标记状态
def clicked_rf1():
transition = {"raised": "sunken", "sunken": "raised"}
btn_rf1["relief"] = transition[btn_rf1["relief"]]
如果需要切换,可以使用不带指示器的checkbutton。它具有“选定”和“取消选定”状态下的颜色选项,您可以将值和标签绑定在一起,以便在切换按钮时标签发生变化 像任何按钮一样,您可以将命令绑定到它。该命令可以检查变量的值,以确定它应该执行“开”功能还是“关”功能 下面是一个简单的例子:
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()
您希望按钮切换还是标签切换?文本/颜色更改只是一个示例。实际上,我希望在第一次单击时运行一堆代码A,在第二次单击时运行一堆代码B。所以,我猜是按钮。在这种情况下,我认为小说的答案应该为按钮和标签提供一个很好的例子。你告诉我:D。一个想法。您可能需要为切换功能添加全局变量。我知道python最终会检查全局,即使它没有提供,但我认为它最适合OP和其他人学习。或者使用
dict
将当前状态映射到下一个状态。非常好!谢谢大家!为什么你的按钮
继承自框架
?@ReblochonMasque因为OP想要一个按钮和一个标签组合在一起,所以我用一个框架来保存这两个。