Tkinter:如何使用一个功能检查单击了哪个按钮?

时间:2018-07-15 17:55:54

标签: python python-3.x tkinter

我一直在和Tkinter玩弄,想出了这个:

enter image description here

import unittest

class TestHelp(unittest.TestCase):

    def setUp(self):
        self.helper = Helper()

    def test_create_list_raise_type_error(self):
        with self.assertRaises(TypeError):
            self.helper.create_list('', 'somename', 'sometype', 'somedescription')
        with self.assertRaises(TypeError):
            self.helper.create_list(1, 1, 'sometype', 'somedescription')
        with self.assertRaises(TypeError):
            self.helper.create_list(1, 'somename', 1, 'somedescription')
        with self.assertRaises(TypeError):
            self.helper.create_list(1, 'somename', 'sometype', 1)

我想知道如何将from tkinter import * root = Tk() def red_color_change(): color_label.configure(fg="red") def blue_color_change(): color_label.configure(fg="blue") red_button = Button(root, text="Red", fg="red", font="Arial, 20", command=red_color_change) red_button.grid(row=0, column=0) blue_button = Button(root, text="Blue", fg="blue", font="Arial, 20", command=blue_color_change) blue_button.grid(row=0, column=1) color_label = Label(root, text="Color", font="Arial, 20") color_label.grid(row=1, columnspan=2) root.mainloop() red_color_change简化为一个函数。目的是通过一种功能更改彩色文本的颜色。

4 个答案:

答案 0 :(得分:2)

为什么不使用lambda表达式?

def color_change(color):
    color_label.configure(fg=color)

red_button = Button(root, text="Red", fg="red", font="Arial, 20")
red_button.grid(row=0, column=0)
red_button.bind('<Button-1>', lambda e: color_change('red'))

blue_button = Button(root, text="Blue", fg="blue", font="Arial, 20")
blue_button.grid(row=0, column=1)
blue_button.bind('<Button-1>', lambda e: color_change('blue'))

可以。

答案 1 :(得分:0)

您可以使用对/错或数字(以另一种方式)。

def color_change(which): #can be integer or boolean
    if which == 1: #can be changed to true
        color_label.configure(fg='red')
    elif which == 2: #can be changed to false
        color_label.configure(fg='blue')

red_button = Button(root, text="Red", fg = "red", font="Arial, 20", command = lambda: color_change(1))

blue_button = Button(root, text="Blue", fg = "blue", font="Arial, 20", command = lambda: color_change(2))

尽管使用整数更好,因为您可以支持更多颜色(不只是2种,带有true / false)

答案 2 :(得分:0)

您可以简化程序,使其仅使用一个按钮和一项功能来切换颜色:

import tkinter as tk


def toggle_color():
    global color_index
    color_index = (color_index + 1) % 2
    color_label.configure(fg=colors[color_index])


if __name__ == '__main__':

    root = tk.Tk()

    colors = ['blue', 'red']
    color_index = 0

    toggle_button = tk.Button(root, text="toggle", fg="black", font="Arial, 20",
                              command=toggle_color)
    toggle_button.grid(row=0, column=0)

    color_label = tk.Label(root, text="Color", font="Arial, 20")
    color_label.grid(row=1, column=0)

    root.mainloop()

答案 3 :(得分:0)

您确实可以使用其他问题的lambda建议,通过直接传递颜色来使此过程更短,甚至更好,使按钮创建自动化:

from tkinter import *

root = Tk()

def color_change(color):
    color_label.configure(fg=color)

for i,color in enumerate(('red','blue')):
    button = Button(root, text=color.title(), fg=color, font="Arial, 20", 
    command=lambda c=color: color_change(c))
    button.grid(row=0, column=i)

color_label = Label(root, text="Color", font="Arial, 20")
color_label.grid(row=1, columnspan=2)

root.mainloop()

请注意,由于颜色参考发生更改,因此现在需要关闭lambda。如果出于某种原因需要保存按钮引用,则还需要一个按钮列表。现在可以轻松添加颜色,并且代码中不需要多余的行。

此外,将所有内容都放在一个类中也是一种好习惯(特别是当您的应用程序变大时)。