首页 > 解决方案 > 如何使用 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 窗口中时,我的代码可以工作,当我点击按钮时,它应该打开文件(我现在只是打印文件名以确保它工作)。但是它只打印列表中的最后一个文件。

抱歉,如果这个问题有点令人困惑,请提前致谢。

标签: pythonpython-2.7tkinter

解决方案


这不是关于 tkinter 的问题,而是关于 python 中的范围和 oop 的问题。我假设您是通过阅读在线资料或快速介绍开始使用 Python 的。我的第一个建议是:如果你不理解,不要使用/复制别人的代码。如果您复制,请尝试自己挖掘并制作您自己的代码。阅读资料的一种好方法是非常好的 python 在线文档。一些帮助您入门的练习: 1) 研究 python 的变量范围。2)更重要的是:阅读类,即面向对象的编程。

对代码:1)完全放弃使用global。这里不需要。如果您想files_in_area在类的所有方法中使用该变量,只需将其作为类的属性,就像您使用master它然后继续在另一个未定义它的方法中使用一样!现在到变量filename:再一次,抛弃全局。然后 filename 位于 for 循环的范围内,这正是您想要的。

像这样看:如果您根本没有使用变量文件名,而只是将text=str(files_in_area[i])其放在 Button 构造函数中作为参数,那么您就不会在这里遇到这个问题 - 从本质上讲,这确实是一个关于自己思考而不是复制的问题其他人的代码太多 - 我知道,因为这对我来说是一个很长一段时间的大问题。

这里最困难的事情是如何根据ifor 循环的不同将命令传递给每个按钮。你可以在 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 中的名称绑定和变量 :)


推荐阅读