我正在创建按钮,该按钮将调用一个函数以将文件导入到我的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个文件。
我是一个完整的初学者,所以请给我一些有关如何更好地做到这一点的提示,并在我不理解的情况下说明您提出的解决方案。
谢谢您的时间。