2016-08-18 3 views
1

수업 목록 카운터에서 프로그램을 진행하고 있습니다. 나는 "Population Count"밑의 프레임 5에 하나의 프로그램을 가지고 있으며, 0이라고 말하면 매번 "Add to classlist"버튼을 누를 때마다 하나씩 증가 할 것입니다. 나는 여러 가지 방법을 시도했지만 시도한 모든 사람들은 결코 작동하지 않습니다. 누구든지 도울 수 있다면 감사 할 것입니다. 여기내 프로그램에서 버튼을 클릭 한 횟수를 계산하십시오.

은, 지금까지 내가 사용하는 것보다

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를 증가 할 필요가population 글로벌 귀하의 버튼을 클릭 처리기. 일반적으로 클래스 메서드를 사용하여 값을 가져 오는 것이 좋습니다.

+0

코딩 형식으로 설명 할 수 있습니까? Thanks –

+1

"def get_population (self) : return self.population"과 같은 쓸모없는 메소드를 추가하는 것을 의미하는 경우 Guido van Rossum으로 시작하는 코어 파이썬 개발자는 일반적으로 나쁜 습관으로 간주합니다. –

1

가능한 해결 : 당신이해야 할 모든 경우, 인구 수를 가지고 있고, 각 버튼 클릭에를 증가 : 편집 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() 

: 나는 전체를 추가 한 코드, 내 제안 된 변경 사항 - 이전 진술에 주석이 달린, 그래서 당신은 변경 사항을 알고 있습니다.

+0

이 작업을 수행하려면 동시에 두 가지 솔루션이 필요하다고 생각합니다. 어떻게 코딩 형식으로 도움을 줄 수 있을까요? –

+0

은 채우기를 좀 더 우아하게 만들기 위해 채우기를 class 특성으로 만들고 increment 메서드를 별도로 설정합니다. 직접 증가 대신 mbutton()에서 add_population()을 호출했습니다. 필요한 경우 다른 명령문을 추가 할 수 있습니다. 전반적으로 위의 코드와 동일하지만 2 3 줄을 추가/편집했습니다. 오후 8시 30 분 P.S. 귀하의 의견을 완전하게받지 못했습니다 - 전체 코드를 원하십니까? –

+0

예, 전 전체 코드를 좋아할 것입니다 –

관련 문제