我有一个复选按钮:
from tkinter import *
master = Tk()
Checkbutton(master, text="Here...").grid(row=0, sticky=W)
mainloop()
看起来像这样:
我试图将检查按钮移到另一边(以支持 RTL 语言),所以它会像:
Here...[]
我知道我可以在复选按钮旁边画一个标签,但是这样点击文本不会影响复选按钮。
我该怎么做?
我有一个复选按钮:
from tkinter import *
master = Tk()
Checkbutton(master, text="Here...").grid(row=0, sticky=W)
mainloop()
看起来像这样:
我试图将检查按钮移到另一边(以支持 RTL 语言),所以它会像:
Here...[]
我知道我可以在复选按钮旁边画一个标签,但是这样点击文本不会影响复选按钮。
我该怎么做?
您可以将 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()
上述代码的输出与第一种方法的输出保持一致。唯一的区别是它现在更容易扩展,因为可以在需要时创建对象,并且不需要每次都重复相同的代码行。
您可以尝试使用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()
结果: