python3.4:类checkbutton和框架的混合?

2024-05-19 09:35:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我是面向对象编程的初学者。 我已经编写了下面的程序,但是我不能用checkbuttons得到第二个窗口,同时也不能得到checkbutton映射的结果。你知道吗

我当然有一些编程错误,但我不知道在哪里? 我使用的是python3.4

import os
from tkinter.filedialog import askopenfilename
global listmgw

class Checkbar(object):
    # fenetre d'echange pour selectionner les mgw
    def __init__(self):
        dicorefsys={}
        self.filepath='C:/Desktop/fichiers projet python/travail/'#directory          whitch contains .txt files which will be my reference
        self.filename=''
        self.filepathes=[]
        os.chdir (self.filepath+'/'+self.filename)


        self.reference=''
        print('reference=',self.reference)
        self.root=Tk()
        self.root.title('Programe Pricipale')
        #self.message = Label(self, text="La reference est:")
        self.mainchoice()
        self.message = Label(self.root, text="choisissez votre reference.").grid(row=2,column=1,columnspan=3,sticky=N,padx =10, pady =5)

        #
        Button(self.root,text='modifier \n Reference', command=self.changeref).grid(row=3,column=1,sticky=S,padx =10, pady =5)
        Button(self.root,text='ajout \n supperssion \n MGW', command=allstates()).grid(row=3,column = 3,sticky=S,padx =10, pady =5)
        Button(self.root,text='Quitter', command=self.root.quit).grid(row=3,column = 5,sticky=S,padx =10, pady =5)
        self.root.mainloop()

    def mainchoice(self):
        #
        print ('on dans mainchoice')


    def changeref (self):
        import dicoref
        dicorefsys={}
        #chdir(self.filepath)
        #self.filepath=''
        #self.filename=""
        (self.filepath, self.filename) = os.path.split(askopenfilename())
        print(self.filepath,self.filename)
        dicorefsys=dicoref.reference(self.filepath+'/',self.filename)
        #print(dicorefsys)
        #self.message["text"] = "La MGW de reference est {}.".format(self.filename)
        self.reference=str(dicorefsys['system-name'])
        print('self.reference=',self.reference)
        self.message = Label(self.root, text='La MGW de reference est:  '+str(self.reference)).grid(row=2,column=1,columnspan=3,sticky=N,padx =10, pady =5)
        return dicorefsys
        #



class Selecteur(object):
    def __init__(self,parent=None, picks=[]):
      Frame.__init__(self, parent)
      #fen1=Tk
      self.vars = []
      print('on est dans le Selecteur')
      for pick in picks:
        print('pick=',pick)
        var = IntVar()
        self.chk = Checkbutton(fen1, text=pick, variable=var)
        self.chk.grid()
        self.vars.append(var)

    def state(self):
        print('je suis dans state')
        print (("lambda=",lambda var: var.get()))
        print('map=',map((lambda var: var.get()), self.vars))
        return map((lambda var: var.get()), self.vars)

    def choixmgwed2(self):

        print('je suis dans choixmgwed2')
        i = 0
        nbvmg = 0
        listmgw = []
        filepath = []
        listmgw = os.listdir('C:/Desktop/fichiers projet python/config_mgw')#directory which contains .txt configuration files
        print('danschoix listgmw=',listmgw)
        nbvmg = len(listmgw)
        filepath.append('C:/Desktop/fichiers projet python/config_mgw/' + listmgw[i])
        i = i + 1
        return listmgw


def allstates(lng):
   print(lng.__doc__)
   print(list(lng.state()))



# Programme principal :
if '__main__' == __name__:
    from tkinter import *
    print('c est parti')
    f = Checkbar()

实际版本的问题是:

  1. 复选按钮不会出现在新窗口中
  2. 我不知道如何恢复checkbutton的“映射”。你知道吗

我怎样才能修好它们?你知道吗


Tags: textselfvardefcolumnrootfilenamegrid
1条回答
网友
1楼 · 发布于 2024-05-19 09:35:10

主要的问题似乎是您的类继承自object,但是您试图调用Frame类的__init__函数。我认为你的意图是继承Frame

class Selecteur(Frame):
    ...

您的代码似乎还依赖于一个名为fen1的全局变量,您从未设置过它。似乎fen1引用了一个小部件,因为您使用它作为创建Checkbutton的第一个参数。如果您的类继承自Frame,那么使用self而不是fen1似乎更有意义,这样checkbutton就进入框架而不是根窗口。你知道吗

self.chk = Checkbutton(self, ...)

您还有一个与Selecteur类无关的问题。有一个按钮定义如下命令属性:

Button(..., command=allstates()).grid(...)

由于使用了allstates(),python将立即调用该函数,并将结果赋给command属性。但是,该函数返回的是列表,而不是函数。我猜您的意图是让按钮在单击时调用allstates,因此您需要将上面的更改为:

Button(..., command=allstates).grid(...)

虽然,allstates需要一个论点,但我不知道这个论点应该是什么,所以我不确定你的真正意图是什么。你知道吗

除此之外,你的代码似乎工作。您问题中的示例从未实际调用Selecteur,因此这可能是另一个问题,除非这只是发布的代码的问题,而不是实际代码的问题。你知道吗

相关问题 更多 >

    热门问题