我正在尝试为学校项目创建菜单,并希望使其能够读取给定目录中的文件,并根据其中存在的文件在屏幕上创建按钮。我目前的主要问题是我无法让Button发送我需要的信息。
我试图以其他方式使用这些功能,但这是我所能获得的最接近的功能。
class Menu(Frame):
def __init__(self, master=None):
#working out how big to make the window
global files_in_area
files_in_area = []
files_in_area = os.listdir(menu_folder_loc)
print files_in_area
a = len(files_in_area)
b = 3
rows = a / b
rows = rows + 1
window_height = rows * 56
root.geometry('%dx%d+%d+%d' % (450, window_height, 0, 0))
Frame.__init__(self, master)
self.master = master
self.init_menu()
def init_menu(self):
self.master.title("Menu")
self.pack(fill=BOTH, expand=1)
for i in range(0, len(files_in_area)):
#button placment
a = i
b = 3
row_no = a / b
row_no = row_no + 1
column_no = a % b
global file_name
file_name = str(files_in_area[i])
b1 = Button(self, text=file_name, bg= "red", height=3, width=20, command=self.client_print_file).grid(row=row_no, column=column_no, sticky=W)
def client_print_file(self):
print file_name
当找到文件并将它们放在tkinter窗口中时,我已经有了代码,并且当我单击按钮时,它应该打开文件(我现在只是在打印文件名,以便确保它有效)。但是,它仅打印列表中的最后一个文件。
很抱歉,这个问题有点令人困惑,在此先感谢。
答案 0 :(得分:0)
这不是关于tkinter的问题,而是关于python中的作用域和oop的问题。我认为您是通过阅读在线资料开始使用python的,或者快速入门了。我的第一个建议是:如果您不理解,请勿使用/复制他人的代码。如果您进行复制,请尝试深入研究并自行编写代码。读取内容的一种好方法是非常好的python在线文档。 一些使您入门的练习:1)研究python变量的作用域。 2)更重要的是:阅读类,即面向对象的程序。
对代码:1)一起放弃使用global
。不用了如果要在类的所有方法中使用变量files_in_area
,只需将其设为类的属性,就像对master
所做的操作一样,然后可以在其他方法中继续使用它。没有定义的!现在到变量filename
:再次,放弃全局。然后,文件名将位于for循环的范围内,这正是您想要的。
是这样的:如果您根本没有使用变量filename,而只是将text=str(files_in_area[i])
放在Button构造函数中作为参数,那么您就不会在这里遇到这个问题-从本质上讲,这实际上是一个考虑自己而不要从别人那里复制太多代码的问题-我知道这是因为长期以来这对我来说都是个大问题。
这里最难的是如何根据for循环的i
向每个按钮传递命令。您可以在stackoverflow上找到很多内容。这又与变量及其范围有关,也与它们的绑定有关。在每个循环遍历中,我们希望根据i
生成command的值。一种使用此方法的方法是使用(起初是神秘的)lambda
:command=lambda i=i: self.client_print_file(i)
。并用附加参数def client_print_file(self, i):
定义i
...。这里的关键是绑定。 command=lambda i: self.client_print_file(i)
无效。
(另一种代替lambda的方法是使用functools中的partial ...)
作业:阅读lambda及其相关内容,以及有关python中的名称绑定和变量的信息:)