2016-08-18 106 views
1

我正在做班级列表计数器上的程序。我有一个程序,在“人口统计”下面的第5帧中,它表示0,每次点击“添加到班级列表”按钮时,它的意思是每增加一次。我尝试了很多不同的方法,但所有我尝试过的方法似乎都不起作用。如果有人能提供帮助,这将是值得赞赏的。计算在我的程序中点击按钮的次数

这里是我的代码,到目前为止,其余的我已经为我的班级名单柜台做

import pickle 
import os.path 
from tkinter import * 
import tkinter.messagebox 
import tkinter as tk 

class Class: 
    def __init__(self, firstname, lastname): 
     self.firstname = firstname 
     self.lastname = lastname 

class ClassPopulation(): 
    def __init__(self): 
     window = Tk() 
     window.title("Class population") 

     self.firstnameVar = StringVar() 
     self.lastnameVar = StringVar() 

     frame1 = Frame(window) 
     frame1.pack() 
     Label(frame1, text = "First name").grid(row = 1, 
      column = 1, sticky = W) 
     Entry(frame1, textvariable = self.firstnameVar, 
       width = 40).grid(row = 1, column = 2) 

     frame2 = Frame(window) 
     frame2.pack() 
     Label(frame2, text = "Last name").grid(row = 1, column = 1, sticky = W) 
     Entry(frame2, textvariable = self.lastnameVar, 
       width = 40).grid(row = 1, column = 2) 

     frame3 = Frame(window) 
     frame3.pack() 
     Button(frame3, text = "Add to classlist", 
      command = self.processAdd).grid(row = 1, column = 1) 

     frame4 = Frame(window) 
     frame4.pack() 
     Label(frame4, text = "Population Count").grid(row = 1, column = 1, sticky = W) 

     frame5 = Frame(window) 
     frame5.pack() 
     Label(frame5, text = "0").grid(row = 1, column = 1, sticky = W) 
     population = 0 

    def population(label): 
     population = 0 

    def mbutton(): 
     global population 
     population +=1 
     label.config(text=str(population)) 

     self.classList = self.loadClass() 
     self.current = 0 

     if len(self.classList) > 0: 
      self.setClass() 

    def saveClass(self): 
     outfile = open("Population.dat", "wb") 
     pickle.dump(self.classList, outfile) 
     tkinter.messagebox.showinfo("Class Population","New name registered") 
     outfile.close() 

    def loadClass(self): 
     if not os.path.isfile("Population.dat"): 
      return [] # Return an empty list 
     try: 
      infile = open("Population.dat", "rb") 
      classList = pickle.load(infile) 
     except EOFError: 
      classList = [] 

     infile.close() 
     return classList 

    def processAdd(self): 
     classList = Class(self.firstnameVar.get(), self.lastnameVar.get()) 
     self.classList.append(classList) 
     self.saveClass() 


    def setClass(self): 
     self.firstnameVar.set(self.classList[self.current].firstname) 
     self.lastnameVar.set(self.classList[self.current].lastname) 


ClassPopulation() 

回答

3

而不是使用全球​​你需要在你__init__方法声明self.population = 0和递增self.population在你的按钮点击处理器。使用类方法来获取价值通常也被认为是很好的做法。

+0

你能解释,在编码格式?谢谢 –

+1

如果您的意思是添加一个像“def get_population(self):return self.population”这样的无用方法,那么核心python开发人员通常认为这是不好的做法,从Guido van Rossum开始。 –

1

可能的解决方案:如果你想要做的是,有人口数量,并增加它在每个按钮上点击:

import pickle 
import os.path 
from tkinter import * 
import tkinter.messagebox 
import tkinter as tk 

class Class: 
    def __init__(self, firstname, lastname): 
     self.firstname = firstname 
     self.lastname = lastname 

class ClassPopulation(): 
    def __init__(self): 
     window = Tk() 
     window.title("Class population") 

     self.firstnameVar = StringVar() 
     self.lastnameVar = StringVar() 

     frame1 = Frame(window) 
     frame1.pack() 
     Label(frame1, text = "First name").grid(row = 1, 
       column = 1, sticky = W) 
     Entry(frame1, textvariable = self.firstnameVar, 
       width = 40).grid(row = 1, column = 2) 

     frame2 = Frame(window) 
     frame2.pack() 
     Label(frame2, text = "Last name").grid(row = 1, column = 1, sticky = W) 
     Entry(frame2, textvariable = self.lastnameVar, 
       width = 40).grid(row = 1, column = 2) 

     frame3 = Frame(window) 
     frame3.pack() 
     Button(frame3, text = "Add to classlist", 
      command = self.processAdd).grid(row = 1, column = 1) 

     frame4 = Frame(window) 
     frame4.pack() 
     Label(frame4, text = "Population Count").grid(row = 1, column = 1, sticky = W) 

     frame5 = Frame(window) 
     frame5.pack() 
     Label(frame5, text = "0").grid(row = 1, column = 1, sticky = W) 
     # population = 0 
     self.population = 0 # made it a class attr 

    # def population(label): 
    #  population = 0 

    def add_population(self): 
     # having it separate can help in modification or enhancement 
     self.population +=1 

    def mbutton(): 
     # global population 
     # population +=1 
     self.add_population() # increment 
     label.config(text=str(population)) 

     self.classList = self.loadClass() 
     self.current = 0 

     if len(self.classList) > 0: 
      self.setClass() 

    def saveClass(self): 
     outfile = open("Population.dat", "wb") 
     pickle.dump(self.classList, outfile) 
     tkinter.messagebox.showinfo("Class Population","New name registered") 
     outfile.close() 

    def loadClass(self): 
     if not os.path.isfile("Population.dat"): 
      return [] # Return an empty list 
     try: 
      infile = open("Population.dat", "rb") 
      classList = pickle.load(infile) 
     except EOFError: 
      classList = [] 

     infile.close() 
     return classList 

    def processAdd(self): 
     classList = Class(self.firstnameVar.get(), self.lastnameVar.get()) 
     self.classList.append(classList) 
     self.saveClass() 


    def setClass(self): 
     self.firstnameVar.set(self.classList[self.current].firstname) 
     self.lastnameVar.set(self.classList[self.current].lastname) 


ClassPopulation() 

编辑1:我已经添加了完整代码,以及我的建议更改 - 以前的语句会被评论,所以您知道这些更改。

+0

这样做我认为需要2个解决方案在同一时间。你如何做到这一点,或许在编码格式将有所帮助。 –

+0

使群体成为一个类属性,使其更加优雅,并将增量方法分开设置。在mbutton()而不是直接增量中,调用了add_population() - 因为如果需要,可以在其中添加其他语句。总体来说,它与上面的代码相同,只是添加/编辑了2 3行。 P.S.我没有完全评论你的评论 - 你想要完整的代码吗? –

+0

是的,我会爱完整的代码 –