如何在两种状态下使用Tkinter按钮?

时间:2018-04-18 21:14:45

标签: python button tkinter

我有以下代码,当单击Tkinter按钮时会导致颜色/文本更改。我想在第二次单击按钮时恢复原始颜色/文本。

var target = apex.jQuery(this.triggeringElement).closest('tr').find('input[name="f30"]')
//console.log(target)
var source = apex.jQuery(this.triggeringElement).find('input[name="f20"]')

console.log(source)
console.log('valor default: '.concat(source.context.defaultValue))
//var lista  =  apex.jQuery(this.affectedElements[0].innerHTML).find('input[name="f20"]')
var lista  =  apex.jQuery(source.context.form).find('input[name="f20"]')
console.log('lista: '.concat(lista))
for (var x=0;x<lista.length;x++){
    if (source.context.value == lista[x].value && source.context.defaultValue != lista[x].defaultValue){
        console.log(source)
        lista[x].value = source.context.defaultValue
        lista[x].defaultValue = source.context.defaultValue
        source.context.defaultValue = source.context.value
        console.log(lista[x])
    }
}
var colecao = apex.jQuery().find('input[name="f20"]')

var result = target.val() * source.val();

我想要的东西更像是一个切换,但我想要一个按钮的外观。

帮助感激地收到了。

3 个答案:

答案 0 :(得分:4)

您需要一个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()

这是制作自定义Button子类的理想场所,因此您可以在程序中使用其中的许多子句:

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()

答案 1 :(得分:2)

另一种方法可能是将“一堆代码”放入不同的函数中,在迭代器中收集它们,然后从该迭代器中获取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"]]

答案 2 :(得分:2)

如果您想要切换,可以使用没有指示符的检查按钮。它具有选定和取消选择状态下颜色的选项,您可以将值和标签绑定在一起,以便在切换按钮时标签发生变化。

与任何按钮一样,您可以将命令绑定到它。该命令可以检查变量的值,以确定它是否应该执行&#34; on&#34;功能或&#34;关&#34;功能

这是一个简单的例子:

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()