2016-08-18 5 views
1

私はクラスリストカウンタでプログラムを実行しています。 "Population Count"の下のフレーム5に1つのプログラムがあり、0と表示されているたびに、「クラスリストに追加」ボタンが毎回クリックされるたびに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 

    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"のような無駄なメソッドを追加することを意味する場合、Guido van Rossumから始まるコアのPython開発者は通常、悪い習慣とみなされます。 –

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.P.私は完全にあなたのコメントを得ていませんでした - 完全なコードが欲しいですか? –

+0

はい、私は完全なコードを好きになるでしょう –

関連する問題