python - 如何使用 tkinter 按钮将信息发送到定义
问题描述
我正在尝试为学校项目创建一个菜单,并希望它能够读取给定目录中的文件并根据那里的文件在屏幕上创建按钮。我目前的主要问题是我无法让按钮发送我需要的信息。
我试图以不同的方式使用这些功能,但这是我能得到的最接近我想要的东西。
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 窗口中时,我的代码可以工作,当我点击按钮时,它应该打开文件(我现在只是打印文件名以确保它工作)。但是它只打印列表中的最后一个文件。
抱歉,如果这个问题有点令人困惑,请提前致谢。
解决方案
这不是关于 tkinter 的问题,而是关于 python 中的范围和 oop 的问题。我假设您是通过阅读在线资料或快速介绍开始使用 Python 的。我的第一个建议是:如果你不理解,不要使用/复制别人的代码。如果您复制,请尝试自己挖掘并制作您自己的代码。阅读资料的一种好方法是非常好的 python 在线文档。一些帮助您入门的练习: 1) 研究 python 的变量范围。2)更重要的是:阅读类,即面向对象的编程。
对代码:1)完全放弃使用global
。这里不需要。如果您想files_in_area
在类的所有方法中使用该变量,只需将其作为类的属性,就像您使用master
它然后继续在另一个未定义它的方法中使用一样!现在到变量filename
:再一次,抛弃全局。然后 filename 位于 for 循环的范围内,这正是您想要的。
像这样看:如果您根本没有使用变量文件名,而只是将text=str(files_in_area[i])
其放在 Button 构造函数中作为参数,那么您就不会在这里遇到这个问题 - 从本质上讲,这确实是一个关于自己思考而不是复制的问题其他人的代码太多 - 我知道,因为这对我来说是一个很长一段时间的大问题。
这里最困难的事情是如何根据i
for 循环的不同将命令传递给每个按钮。你可以在 stackoverflow 上找到很多。这又是关于变量及其范围的,也与它们的绑定有关。在每个循环过程中,我们希望根据i
. 使用它的一种方法是使用(起初是神秘的)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 中的名称绑定和变量 :)
推荐阅读
- c - 无法为通过看门狗运行并使用共享对象的进程获取内存泄漏报告
- database - Jfrog 工件中的密码历史记录
- python - 熊猫连接具有重复索引的列
- html - 在一个块中拉伸三个 svg 之一的宽度
- c++ - libpng 输出不是预期的输出
- r - R中具有多个单词和特殊字符的词云
- php - php 函数实现覆盖不可为空的参数
- locust - 将数据从一个任务函数传递到另一个任务函数时出现问题,同时顺序任务一个接一个
- java - MongoDB 文档的 @Id 是 HashMap 的属性?
- javascript - 变量定义并用作方法参数,但值从未使用过,因此得到 ESLint Unused Variables