首页 > 解决方案 > 从循环创建多个函数以创建按钮行

问题描述

我想创建一个简单的界面,将教室中的学生姓名列表作为输入,并为每个学生输出一行按钮,

前任:

John Johnson (Idle)(Talking)(etc)

Doris Day    (Idle)(Talking)(etc)

单击每个按钮时,它会将该学生姓名和行为的日志写入输出文件。

我的问题是,它目前使每个按钮都为学生姓名列表中最后一个学生写一个日志。据我了解,这是由于“后期绑定”造成的,但这次我无法在开学前的时间内自行解决。

currentperiod= [studentname1, studentname2, ...etc]   
def behaviorlog(name, behavior):
    write name and behavior to a spreadsheet
def idle():
    name=currentperiod[x]
    behavior='Idle'
    behaviorlog(name,behavior)


def talking():
    name=currentperiod[x]
    behavior='Talking'
    behaviorlog(name,behavior)
def late():
    name=currentperiod[x]
    behavior='Late'
    behaviorlog(name,behavior)
def rude():
    name=currentperiod[x]
    behavior='Rude'
    behaviorlog(name,behavior)
def misplaced():
    name=currentperiod[x]
    behavior='Misplaced'
    behaviorlog(name,behavior)

from tkinter import *
master= Tk()

for x in range(len(currentperiod)):


    Label(master, text=currentperiod[x]).grid(row=x, sticky = W)
    button1=Button(master, text='Idle', command=idlemaker)
    button1.grid(row=x, column=1, sticky=W, pady=4)

    button2=Button(master, text='Talking', command=talking)
    button2.grid(row=x, column=2, sticky=W, pady=4)
    button3=Button(master, text='Late', command=late)
    button3.grid(row=x, column=3, sticky=W, pady=4)
    button4=Button(master, text='Rude', command=rude)
    button4.grid(row=x, column=4, sticky=W, pady=4)
    button5=Button(master, text='Misplaced', command=misplaced)
    button5.grid(row=x, column=5, sticky=W, pady=4)

mainloop( )

标签: pythontkinter

解决方案


您必须将一个学生对象(或他的标识符)传递给该函数。怎么做?可能会帮助您弄清楚。

您在循环中初始化变量x,然后更改它(通过循环),最后它具有循环中的最后一个值(在您的情况下是range(len(currentperiod)) - 1)。然后,当它在您的函数中使用时,它似乎将其用作实际值,而您期望它具有x循环中的值。

我想写的最后一点是,你应该看看面向对象的编程。如果每个学生都只是一个班级的一个实例并且拥有所有的方法,那么您可能更容易编写和理解真正发生的事情。


推荐阅读