如何在创建按钮时给Tkinter按钮一个参数,而不是在按下按钮时给参数

时间:2019-10-15 21:27:08

标签: python python-3.x tkinter

我正在创建按钮,该按钮将调用一个函数以将文件导入到我的python程序中。我使用结合os.listdir()的for循环来遍历给定目录中的文件。对于每个文件,我都会创建一个具有文件名的按钮。当按下按钮时,将调用一个函数,然后将其导入文件,此函数需要3个参数,测验(将新数据附加到的列表),名称(从中获取数据的文件的名称),母版(显示标签的框,该标签显示导入数据的时间)。由于我使用的是for循环来获取文件的名称,因此我将该名称变量作为函数name参数的参数。问题在于仅在按下其中一个按钮并且在for循环完成之后才调用该函数,因此程序求助于对name变量使用最后一个值。例如,如果我有3个文件,分别为file1.txt,file2.txt和file3.txt,则当按下按钮时,仅将file3.txt作为参数。这意味着我只能导入file3.txt,而不能导入其他任何文件。

我正在考虑为每个文件创建一个新框架,用户将不得不按next来查看下一个可能的文件,但这不是一个理想的解决方案。

from tkinter import *
import os

# classes and functions
class Question():
    def __init__(self, q, a, b, c, ans):
        self.q = q
        self.a = a
        self.b = b
        self.c = c
        self.ans = ans
        self.print = self.q + self.a + self.b + self.c + self.ans


def import_the_save(quiz, name, master):
    frame = Frame(master)
    frame.place(relx=0, rely=0, relwidth=1, relheight=1)
    open_file = open(os.getcwd()+'/saves/' + name, 'r')
    for line in open_file.readlines():
        if line != '\n':
            fields = line.split(' | ')
            print(fields)
            quiz.append(Question(fields[0], fields[1], fields[2], fields[3], fields[4]))
    Label(frame, text='File Imported').pack()
    for item in quiz:
        print(item.print)


def myfunction(event):
    global canvas
    canvas.configure(scrollregion=canvas.bbox("all"))

# This is what actually runs    
root = Tk()

quiz = []

canvas = Canvas(root)
g_frame = Frame(canvas)
myscrollbar = Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)

myscrollbar.pack(side="right", fill="y")
canvas.pack(side="left")
canvas.create_window((0, 0), window=g_frame, anchor='nw')
g_frame.bind("<Configure>", myfunction)

for filename in os.listdir(os.getcwd()+'/saves'):
    if filename.endswith(".txt"):
        file = Button(g_frame, text=filename, command=lambda: import_the_save(quiz, filename, root))
        file.pack()

root.mainloop()

上面的代码创建一个tkinter窗口,然后检查文件夹中的txt文件并返回找到的文件名。要复制该问题,您需要在放置此脚本的文件夹内找到一个名为saves的文件夹。在save文件夹内,您将需要一些txt文件,其中每行看起来像这样:

某事|东西|东西|东西|东西

基本上,每行都需要有5个用'|分隔的字符串'

作为测试,我为上面的代码提供了3个不同的文件,内容不同,但是无论我按哪个按钮,它只会导入第3个文件。

我是一个完整的初学者,所以请给我一些有关如何更好地做到这一点的提示,并在我不理解的情况下说明您提出的解决方案。

谢谢您的时间。

0 个答案:

没有答案