Python tkinter“;选择全部";复选框和对齐

Python tkinter“;选择全部";复选框和对齐,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,通过选择所有复选框,我希望在所有复选框的顶部有一个全选复选框。单击“下一步”按钮后,第二帧将出现,其中包含代码列表中提到的复选框 from tkinter import * def raise_frame(frame): frame.tkraise() root = Tk() f1 = Frame(root) f2 = Frame(root) def Quit(): root.destroy() checkvar1 = IntVar() checkvar2 = I

通过选择所有复选框,我希望在所有复选框的顶部有一个全选复选框。单击“下一步”按钮后,第二帧将出现,其中包含代码列表中提到的复选框

from tkinter import *
def raise_frame(frame):
    frame.tkraise()

root = Tk()

f1 = Frame(root)
f2 = Frame(root)

def Quit():
    root.destroy()
checkvar1 = IntVar()  
  
checkvar2 = IntVar()  
  
checkvar3 = IntVar()

def checkbox():
    raise_frame(f2)
    IPR_List=["COMM 662 SCTP PATH UP","COMM 665 SCTP PATH DOWN","COMM 478 GLOBALMTITLE TRANSLATION      FAILURE","COMM 275 MTP LEVEL ROUTING ERROR",
              "COMM 628 SCTP ASSOCIATION ESTABLISHED","COMM 0629 SCTP ASSOCIATION TERMINATED","COMM 137 CCS7:SRC DPC FAILED","139 CCS7:SRC DPC ACTIVATED",
              "COMM 338 CCS7:SCCP SUBSYS--OUT-OF-SERVICE","COMM 339 CCS7:SCCP SUBSYS--IN-OF-SERVICE","363 SCCP:ROUTE on PC/SSN FAILURE",
              "COMM 479 FLEX RTNG FILTERING MATCHED","COMM 271 GATEWAY.SS7 MSU REJECTED","COMM 93 CCS7:SEQ TABLE CKSUM MISMATCH",]
    j=0
    for i in IPR_List:
        chkbtn = Checkbutton(f2, text = i,  onvalue = 1, offvalue = 0, height = 2, width = 70).grid(row=j,column=1)
        j=j+1
    
for frame in (f1, f2):
    frame.grid(row=0, column=0, sticky='news')


sd=StringVar()
pathlabel = Entry(f1,text=sd,font=('times',10,'bold'),fg='blue',bg='white',width=60)
pathlabel.grid(row=1,column=1)
browsebutton = Button(f1, text="Browse")
browsebutton.grid(row=1,column=2)
Button(f1, text='NEXT', command=checkbox).grid(row=2,column=1)

Quit = Button(f1, text="Quit", command=Quit)
Quit.grid(row=2,column=2)




raise_frame(f1)
root.mainloop()
我希望将所有复选框保留在一行的左侧。在此基础上,我希望通过选择所有复选框,在所有复选框的顶部设置一个全选复选框。

因此,这是我的解决方案(可能可以简化,但……它是一个解决方案):

从tkinter导入Tk、Checkbutton、Frame、IntVar
类选项:
def uuu init uuuu(self,parent,name,selection=None,select_all=False):
self.parent=parent
self.name=名称
自我选择=选择
self.variable=IntVar()
self.checkbutton=checkbutton(self.parent,text=self.name,
变量=self.variable,命令=self.check)
如果选择为“无”:
self.checkbutton.pack(side='top')
elif选择所有:
self.checkbutton.config(命令=self.select\u all)
self.checkbutton.pack()
对于self.selection中的项目:
项目。检查按钮。包装(侧边和顶部)
def检查(自我):
state=self.variable.get()
如果state==1:
打印(f'Selected:{self.name}')
如果全部([如果item.variable.get()==1,则为True;对于self.selection[:-1]]中的项,则为False):
self.selection[-1].checkbutton.select()
elif状态==0:
打印(f'取消选择:{self.name}')
如果self.selection[-1].variable.get()==1:
self.selection[-1].checkbutton.deselect()
def全选(自选):
state=self.variable.get()
如果state==1:
对于self.selection[:-1]中的项:
item.checkbutton.deselect()项
item.checkbutton.invoke()
elif状态==0:
对于self.selection[:-1]中的项:
item.checkbutton.select()
item.checkbutton.invoke()
选择=[]
root=Tk()
选项\帧=帧(根)
选项\框架包装(侧面为左,填充为y)
对于范围(5)中的i:
附加(选项(选项_框架,f'option{i+1}',selection))
附加(选项(选项“全部选择”,选择,真))
root.mainloop()
关于如何设置的快速说明。如果有一组复选框要添加一个
全选
复选框,则必须将它们全部附加到列表中,并在循环中创建它们时将该列表作为第三个参数,如示例所示。然后,在循环之后,您希望附加另一个实例,但还必须将第四个参数设置为True。这将允许轻松创建带有全选的复选框。如果您只想有几个复选框,只需将它们放在一个循环中,并只添加前两个参数:parent和name

希望澄清如何设置。关于编码部分:

当在代码中取消选择全部,然后在应该选择的时候调用时,可能会出现一些混乱。原因是首先需要清除所有复选框,因为
.invoke()
会将它们切换到相反的位置,并且还会模拟用户输入,因此所有复选框都将调用
.check()
方法,而对于取消选择,则以相反的方式工作

def全选(self):
state=self.variable.get()
如果state==1:
对于self.selection[:-1]中的项:
item.checkbutton.deselect()项
item.checkbutton.invoke()
elif状态==0:
对于self.selection[:-1]中的项:
item.checkbutton.select()
item.checkbutton.invoke()
此外,如果if all selected和一个或多个get deselected的功能被用户自动取消选中select all复选框(因为它是不真实的),代码可能会变得不那么复杂。(最后2行)

elif状态==0:
打印(f'取消选择:{self.name}')
如果self.selection[-1].variable.get()==1:
self.selection[-1].checkbutton.deselect()
编辑1:添加代码,如果用户选择了所有复选框(并且用户未选择所有复选框)(最后2行),则选中所有复选框

如果状态==1:
打印(f'Selected:{self.name}')
如果全部([如果item.variable.get()==1,则为True;对于self.selection[:-1]]中的项,则为False):
self.selection[-1].checkbutton.select()
我想说剩下的是非常简单的python逻辑,所以如果您有问题,可以问他们

下面是我用于属性和方法的源代码


对于对齐,请将
anchor=“w”
添加到
Checkbutton(…)
。添加一个#python标记,它可能有助于获得答案
   for i in range(len(IPR_LIST)):  
        Checkbutton(root2,text=IPR_LIST[i],variable=chkboxlist[i]).place(relx=x,rely=y)
        y=y+0.05
        c=c+1
        if c==8:
            x=x+0.15
            y=0.05
            c=0