Checkbutton响应文本的点击

时间:2018-01-16 12:32:27

标签: python tkinter

默认情况下,tkinter的Checkbutton窗口小部件会响应窗口小部件中的任何位置,而不是仅仅在复选框字段中。

例如,请考虑以下(Python 2)代码:

import Tkinter as tk
main = tk.Tk()
check = tk.Checkbutton(main, text="Click").pack()
main.mainloop()

运行此代码会产生一个小窗口,只有一个复选框,并带有单词" Click"。如果单击复选框,则会切换。

但是,如果您单击窗口小部件的文本而不是复选框,也会发生这种情况。

这可以预防吗?我可以创建一个单独的小部件来保存文本,但这仍然会导致复选框周围的小区域响应点击。

2 个答案:

答案 0 :(得分:0)

我想到了两个解决方案:

  1. 按照您的建议并为复选按钮和标签创建单独的小部件。
  2. 用你自己的方法替换checkbutton上的绑定,并检查点击的x / y坐标,只有在小部件的一个小区域内发生点击时才接受点击。

答案 1 :(得分:0)

该程序创建一个checkbutton并通过将方法绑定到checkbutton来覆盖它上面的默认事件。单击该按钮时,该方法将检查已定义的限制以允许正常操作或覆盖。 OP希望确保在单击检查按钮的文本时,不会执行默认操作。这基本上就是这样做的。

import tkinter as tk
import tkinter.ttk as ttk

class App(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        self.checkvar = IntVar()
        check = tk.Checkbutton(parent, text='Click', variable=self.checkvar)
        check.bind('<Button-1>', self.checkCheck)
        check.pack()
        print(dir(check))

    def checkCheck(self, event):
        # Set limit based on your font and preference
        limit = 18
        print(event.x, event.y, self.checkvar.get())
        if event.x > limit or event.y > limit:
            self.checkvar.set(not self.checkvar.get())
        else:
            print("Normal behavior")


if __name__ == "__main__":
    window = tk.Tk()
    app = App(window)
    window.mainloop()