3

我有一个复选按钮:

from tkinter import *
master = Tk()
Checkbutton(master, text="Here...").grid(row=0, sticky=W)
mainloop()

看起来像这样:

在此处输入图像描述

我试图将检查按钮移到另一边(以支持 RTL 语言),所以它会像:

Here...[]

我知道我可以在复选按钮旁边画一个标签,但是这样点击文本不会影响复选按钮。

我该怎么做?

4

2 回答 2

4

您可以将 label 的鼠标左键单击事件绑定到切换checkbutton -的 lambda 构造:

label.bind("<Button-1>", lambda x : check_button.toggle())

然后可以使用网格将标签放置在检查按钮之前(如最后的 OP 中所述) - :

from tkinter import *

master = Tk()

l1 = Label(master, text = "Here...")
cb = Checkbutton(master)
l1.grid(row = 0, column = 0)
cb.grid(row = 0, column = 1, sticky=W)

l1.bind("<Button-1>", lambda x : cb.toggle())
mainloop()

即使单击标签,这也会切换复选按钮。

输出-:

输出


笔记:

checkbutton 现在必须作为 object( cb) 获取,以在 lambda 构造中用于标签的绑定函数回调参数。因此,它在下一行被网格化。单独管理几何图形通常是一种很好的做法,这样可以防止出现此类错误


此外,正如@Alexander B.在评论中链接的帖子中所提到的,如果要多次使用此程序集,也可以将其制成一个继承自该类的自己的类-:tkinter.Frame

class LabeledCheckbutton(Frame):
    def __init__(self, root, text = ""):
        Frame.__init__(self, root)
        self.checkbutton = Checkbutton(self)
        self.label = Label(self, text = text)
        self.label.grid(row = 0, column = 0)
        self.checkbutton.grid(row = 0, column = 1)
        self.label.bind('<Button-1>', lambda x : self.checkbutton.toggle())
        return
    
    pass

将其与网格一起用作几何管理器,将使完整的代码如下所示:

from tkinter import *

class LabeledCheckbutton(Frame):
    def __init__(self, root, text = ""):
        Frame.__init__(self, root)
        self.checkbutton = Checkbutton(self)
        self.label = Label(self, text = text)
        self.label.grid(row = 0, column = 0)
        self.checkbutton.grid(row = 0, column = 1)
        self.label.bind('<Button-1>', lambda x : self.checkbutton.toggle())
        return
    
    pass

master = Tk()
lcb = LabeledCheckbutton(master, text = "Here...")
lcb.grid(row = 0, sticky = W)

mainloop()

上述代码的输出与第一种方法的输出保持一致。唯一的区别是它现在更容易扩展,因为可以在需要时创建对象,并且不需要每次都重复相同的代码行。

于 2022-03-04T08:16:57.647 回答
3

您可以尝试使用ttk.Checkbutton可以更改其布局的方法ttk.Style().layout(...)

import tkinter as tk
from tkinter import ttk

master = tk.Tk()

s = ttk.Style()
# create a custom Checkbutton style with reverse order of label and indicator
s.layout('right.TCheckbutton',
   [('Checkbutton.padding', {'sticky': 'nswe', 'children': [
      ('Checkbutton.focus', {
         'side': 'left', 'sticky': 'w', 'children': [('Checkbutton.label', {'sticky': 'nswe'})]
      }),
      ('Checkbutton.indicator', {'side': 'left', 'sticky': ''})
   ]})]
)

ttk.Checkbutton(master, text='Here...', style='right.TCheckbutton').grid(padx=20, pady=10)

master.mainloop()

结果:

在此处输入图像描述

于 2022-03-04T17:05:45.323 回答