Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算在我的程序中单击按钮的次数_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 计算在我的程序中单击按钮的次数

Python 计算在我的程序中单击按钮的次数,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在班级列表计数器上做一个程序。我有一个程序,在第5帧的“人口计数”下面,上面写着0,它意味着每次点击“添加到类列表”按钮时都会增加一个。我尝试了许多不同的方法,但所有我尝试过的方法似乎都不起作用。如果有人能帮忙,我们将不胜感激 这是到目前为止我的代码,其余的我都为我的类列表计数器做了 import pickle import os.path from tkinter import * import tkinter.messagebox import tkinter as tk class

我正在班级列表计数器上做一个程序。我有一个程序,在第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()

您需要在
\uuuu init\uuuu
方法中声明
self.population=0
,并在按钮单击处理程序中递增
self.population
,而不是使用global
population
。通常也认为使用类方法来获取值是一种良好的做法。

而不是使用全局
填充
您需要在
初始化
方法中声明
self.population=0
,并在按钮单击处理程序中增加
self.population
。通常认为使用类方法来获取值也是一种好的做法。

可能的解决方案:如果您只想做的是,进行总体计数,并在每次单击按钮时递增它:

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:我已经添加了完整的代码,以及我建议的更改-前面的语句会被注释,因此您知道这些更改。

可能的解决方案:如果您只想做的是,进行人口计数,并在每个按钮上增加它,单击:

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:我已经添加了完整的代码,以及我建议的更改-前面的语句已注释,因此您知道这些更改。

我认为这样做需要同时使用两种解决方案。如何做到这一点,也许编码格式会有所帮助。将填充设置为类属性以使其更优雅,并将增量方法设置为单独的。在mbutton()中而不是直接增量中,调用add_population()-因为如果需要,可以在那里添加其他语句。总的来说,它与上面的代码相同,只是添加/编辑了23行。另外,我没有完全收到你的评论-你想要完整的代码吗?Nabeel您好,你在那里吗?我认为这需要同时使用两种解决方案。如何做到这一点,也许编码格式会有所帮助。将填充设置为类属性以使其更优雅,并将增量方法设置为单独的。在mbutton()中而不是直接增量中,调用add_population()-因为如果需要,可以在那里添加其他语句。总的来说,它与上面的代码相同,只是添加/编辑了23行。另外,我没有完全收到你的评论-你想要完整的代码吗?Nabeel你好,你能用编码格式解释吗?谢谢,如果你的意思是添加一个无用的方法,比如“def get_population(self):return self.population”,那么从Guido van Rossum开始,核心python开发人员通常认为这是一个糟糕的做法。你能用编码格式解释一下吗?谢谢,如果您的意思是添加一个无用的方法,比如“def get_population(self):return self.population”,那么从Guido van Rossum开始,核心python开发人员通常认为这是一个糟糕的做法。