TK python 复选按钮 RTL

TK python checkbutton RTL

我有一个复选按钮:

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

看起来像这样:

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

Here...[]

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

我该怎么做?

您可以 bind the left mouse button click event of the label, to a lambda construct that toggles 复选按钮 -:

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 现在必须作为一个对象 (cb) 获取,以便在标签的绑定函数回调参数的 lambda 构造中使用。因此,它在下一行中被网格化。单独管理几何图形通常是一种很好的做法,这样可以防止出现 this one.

这样的错误

另外,如评论中的post linked by @Alexander B.所述,如果要多次使用此程序集,也可以将其做成自己的class,继承自tkinter.Frame class -:

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

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

您可以尝试使用 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()

结果: