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()
结果:
我有一个复选按钮:
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()
结果: