【问题标题】:How does a Tkinter checkbox control corresponding textbox widget? PythonTkinter 复选框如何控制相应的文本框小部件? Python
【发布时间】:2021-11-22 12:59:47
【问题描述】:

我有一个简单的 tkinter 程序,在单击“创建框”按钮时,它会创建一个 Checkbutton 和一个 Text 小部件。我试图启用/禁用基于 Checkbutton 的 Text 小部件。例如,如果勾选了 Checkbutton,则相应的 Text 按钮将被禁用。

下面的代码确实可以正常工作,但我不知道怎么做? Checkbutton 如何跟踪对应的 Text 小部件?

我已经尝试了多个 Checkbuttons,它们都没有似乎干扰其他的 Text 小部件。

from tkinter import *

root = Tk()
root.geometry('500x300')

def create_boxes():

    def disable_text():
        if textbox['state'] == NORMAL:
            textbox['state'] = DISABLED
        else:
            textbox['state'] = NORMAL


    checkbox = Checkbutton(root, command = disable_text)
    textbox = Text(root, height= 1, width = 30)

    checkbox.pack()
    textbox.pack()

create_chechkbutton = Button(root, text= 'Create a checkbox and textbox', command= create_boxes)
create_chechkbutton.pack()

root.mainloop()

感谢任何解释。

【问题讨论】:

    标签: python tkinter text checkbox widget


    【解决方案1】:

    复选框本身实际上并没有跟踪任何内容。这段代码的作用是将复选框绑定disable_text() 函数。实际上,这意味着只要选中该复选框,就会调用disable_text()。所以,实际上是 函数 disable_text() 正在跟踪文本。

    当复选框被创建时:checkbox = Checkbutton(root, command = disable_text)disable_text() 函数被传递给command 参数。这告诉 tkinter 每当按下检查按钮时调用disable_text()

    disable_text() 中,有一个if 语句用于检查文本是否被禁用。如果文本禁用disable_text()启用它。如果文本没有被禁用,那么disable_text()禁用它。

    请注意,这不会获取复选框的状态;也就是说,它不根据复选框的状态设置文本的状态:它根据文本的状态设置文本的状态。因此,如果文本要开始禁用而不是启用,则复选框将在文本启用时被选中,而在未启用时取消选中。您可以将checkbox 设为Button 而不是Checkbutton,这不会影响代码的运行方式。

    如果您的程序中有多个检查按钮,每个都有自己的文本,则必须使用 lambda 语句绑定 disable_text() 函数,并使用参数告诉它哪个检查按钮正在调用它。以下是控制多个文本小部件的多个检查按钮的示例:

    from tkinter import *
    
    root = Tk()
    root.geometry('500x300')
    
    def create_boxes():
    
        def disable_text(checkbox): ### EDITED LINE
            textbox = checkbox.textbox ### ADDED LINE
            if textbox['state'] == NORMAL:
                textbox['state'] = DISABLED
            else:
                textbox['state'] = NORMAL
    
        for x in range(0, 5): ### ADDED LINE
            checkbox = Checkbutton(root)
            checkbox.config(command=lambda checkbutton=checkbox: disable_text(checkbutton)) ### EDTIED LINE
            textbox = Text(root, height= 1, width = 30)
            checkbox.textbox = textbox ### ADDED LINE
    
            checkbox.pack()
            textbox.pack()
    
    create_chechkbutton = Button(root, text= 'Create a checkbox and textbox', command=create_boxes)
    create_chechkbutton.pack()
    
    root.mainloop()
    

    使用for 循环,创建并打包检查按钮和文本小部件。 checkbox.textbox = textbox 创建checkbox 的新属性,并将其分配给复选框,以便该复选框与该文本小部件相关联。线

    checkbox.config(command=lambda checkbutton=checkbox: disable_text(checkbutton))
    

    使检查按钮能够在调用它时将自身作为参数传递给disable_text()。然后,disable_text() 只需获取与它在其参数中获得的检查按钮相关联的文本小部件,并禁用或启用它。

    【讨论】:

    • 那么,如果有多个 Checkbuttons,one disable_text 函数如何区分要禁用/启用哪个 Text 小部件实例?还是每个检查按钮都有一个绑定到它的``` disable_text ``` 函数实例,它跟踪its Text 小部件(可能是调用函数时创建的最后一个)?跨度>
    • @Ye_kya:理想情况下,one disable_text() 可以根据调用它的检查按钮来识别它必须更改的文本。我会把这个放在我的回答中;我想我误解了你问题的那一部分。
    • 非常感谢您花时间如此详细地回答和解释代码。它更加清晰,我可以看到它是如何工作的。我会认为我的尝试是一种荒谬的 hacky 方式来看似达到相同的结果,但我自己并不相信它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2019-01-20
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多