【问题标题】:how to send information to a define with a tkinter button如何使用 tkinter 按钮将信息发送到定义
【发布时间】:2019-01-17 10:33:47
【问题描述】:

我正在尝试为一个学校项目创建一个菜单,并希望它能够读取给定目录中的文件并根据那里的文件在屏幕上创建按钮。我目前的主要问题是我无法让按钮发送我需要的信息。

我尝试以不同的方式使用这些功能,但这是最接近我想要的方式。

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 窗口时,我的代码可以工作,当我点击按钮时,它应该打开文件(我现在只是打印文件名来制作确保它有效)。但是它只打印列表中的最后一个文件。

对不起,如果这个问题有点令人困惑,在此先感谢。

【问题讨论】:

  • “打印列表中的最后一个文件。”:它不打印来自 files_in_area 的任何内容,您正在打印 global file_name 的值。
  • 我尝试为按钮使用一个值,以便我可以从主数组本身读取它,但我无法让它工作,它总是说不正确的数量给出了论据。有什么办法可以解决吗?
  • “有什么办法可以解决吗?”:可以,搜索[python] [tkinter] [button]

标签: python python-2.7 tkinter


【解决方案1】:

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

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

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

这里最难的是如何根据 for 循环的i 将命令传递给每个按钮。你可以在 stackoverflow 上找到很多。这又是关于变量及其范围的,也与它们的绑定有关。在每个循环过程中,我们希望根据i 生成一个命令值。使用它的一种方法是使用(起初很神秘)lambda:command=lambda i=i: self.client_print_file(i)。并使用附加参数i 定义def client_print_file(self, i): ...。这里的关键是绑定。不起作用的是command=lambda i: self.client_print_file(i)。 (另一种不使用 lambda 的方法是使用 functools 中的 partial ...) 作业:阅读 lambda 以及它是什么以及关于 python 中的名称绑定和变量:)

【讨论】:

  • 谢谢。我已经坚持了很长时间,而且它第一次起作用。我之前编写了一个菜单,但没有从文件中制作按钮。我想我对类的理解感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多