【问题标题】:How to save "self" return value to a variable from Class B: to Class A when Class B gets that value returned by Class C [duplicate]如何将“自我”返回值保存到 B 类的变量中:当 B 类获取 C 类返回的值时到 A 类 [重复]
【发布时间】:2018-06-21 09:11:18
【问题描述】:

首先我对 OOP 编码很陌生,很抱歉提出愚蠢的问题。

如果有意义的话,我从 Class AskDir 返回一个从 Class SelectDirClass MainWindow 的值时遇到问题 p>

目前我拥有的代码在其他方面都有效,除了我无法保存来自 Class AskDir() 的实际“self”(即路径,即“/home/etc/”)返回值 strong> 到另一个变量,无论我做什么。

根据我的阅读,我应该能够通过 a = AskDir(self) 获得返回值 print(a),但我得到的是 ".!frame.!functionchangename.!askdir"

简而言之,如何将AskDir类中函数的实际返回路径保存到MainWindow()类中的变量a中?

为了澄清,我想要的是 Class MainWindow() 有一个变量 (a),它从 Class SelectDir() 中的子函数 get() 获取返回值,并且该值应该是 path get() 函数返回

简化代码:

class MainWindow:
    self.controller = controller

    # prints the button to this frame!
    getdir = AskDir(self)
    print(getdir) # this should return actual path (/home/etc/), but it doesnt

class AskDir(tk.Frame):
    def __init__(self, container):
        tk.Frame.__init__(self, container)

        self.selectdir = SelectDir(self, "Select directory", 
                                   "/home/user/folder/")

        button = tk.Button(frame, text="Select directory",
                           command=self.select_dir)

        self.act_dir = tk.StringVar()
        self.act_dir.set("/home/")

    def select_dir(self):
        self.selectdir.show()
        self.act_dir.set(self.selectdir.get())

class SelectDir:
    def __init__(self, container, title, initial):
        self.master = container

    def show(self):
        result = filedialog.askdirectory()
        if result:
            self.selected = result

    # THIS RETURNS THE ACTUAL PATH!
    def get(self):
        return self.selected

【问题讨论】:

  • 自我在班级工作,但不在班级和另一个班级之间;如果你想将一个类的值传递给另一个类,你需要调用该类并返回一些值。
  • 您能否尝试发布一个简单的(r)示例,在其中准确解释您想要做什么。从您的问题来看,您很难理解您具体要做什么,尤其是当您引用代码中不存在的类时。
  • 好的,请稍等,我稍微编辑一下代码。
  • 你混淆了函数和类。 getdir = AskDir(self) 将创建 AskDir 类的一个实例,并将对它的引用保留在 getdir 变量中。您应该创建该类的一个实例,然后调用其方法之一,该方法将返回文件路径。例如directoryClass = AskDir(self)getdir = directoryClass.get()
  • How to create a Minimal, Complete, and Verifiable Example 并且不要重新发布您已经提出但没有答案的问题。 **不是标记code 的方式,使用`(反引号)字符。如果您打算在这里向其他人寻求帮助,我建议您花一点时间学习如何正确使用该网站。

标签: python oop tkinter


【解决方案1】:

这对你有用吗?

我认为不需要将 SelectDir 作为一个类,因为它的目的只是调用 askdirectory 方法并返回选定的文件夹路径,因此我将其更改为一个函数。

在此示例中,按下“选择目录”按钮将打开目录对话框,然后将选定的目录文本放入条目小部件中。

如果MainWindow 类希望在设置路径后对其进行任何操作,那么您只需调用AskDirget_dir 方法,例如print(askDir.get_dir()

import tkinter as tk
from tkinter import filedialog

def doStuffFunction(value):
    print(value)

class MainWindow(tk.Frame):
    def __init__(self,master=None,**kw):
        tk.Frame.__init__(self,master=master,**kw)
        self.askDir = AskDir(self)
        self.askDir.grid()
        doStuffButton = tk.Button(self, text="Do Stuff", command=self.doStuff)
        doStuffButton.grid()


    def doStuff(self):
        doStuffFunction(self.askDir.get_dir())

class AskDir(tk.Frame):
    def __init__(self, master, **kw):
        tk.Frame.__init__(self, master=master,**kw)



        button = tk.Button(self, text="Select directory",
                           command=self.select_dir)
        button.grid(row=0,column=1)

        self.act_dir = tk.StringVar()
        self.act_dir.set("/home/")

        self.pathBox = tk.Entry(self, textvariable=self.act_dir,width=50)
        self.pathBox.grid(row=0,column=0)

    def select_dir(self):
        selectdir = SelectDir("Select directory", "/home/user/folder/")
        self.act_dir.set(selectdir)

    def get_dir(self):
        return self.act_dir.get()


def SelectDir(title,initial):
    result = filedialog.askdirectory(initialdir=initial,title=title)
    return result


if __name__ == '__main__':
    root = tk.Tk()
    MainWindow(root).grid()
    root.mainloop()

您现在可以在 MainWindow 中多次使用AskDir 类(可能选择源路径和目标路径)。这已通过MainWindow 中的doStuff 方法添加到我的示例中。

【讨论】:

  • 它几乎可以工作了,它现在打印一条路径,就像我想要的那样,但它总是打印 self.act_dir.set 路径,即 /home /,可能是我的错误,将给定的代码实现到我的,我试试看我是否可以修复它。
  • 可能是时间问题。您可能在用户有机会选择新目录并更新 self.act_dir 之前调用 print。
  • 不,我仍然无法让它工作,现在尝试了几个小时:(假设我们使用您提供的代码作为示例,我们在 class MainWindow() 中添加了一个函数 def savepaths(self),我们想要将路径save_dirread_dirMainWindow 传递到那里的变量中,这会怎样?我需要这些路径,以便我可以将它们传递给另一个pythonfile,使用它们来做事。
  • @Nanoni 我更新了我的示例,以展示如何将文件夹路径用作传递给另一个函数doStuffFunction 的参数。我添加了一个按钮,用户可以在对文件夹选择感到满意并希望“事情”发生时单击该按钮。
  • 哦...现在我知道我的错误在哪里了。我在 MainWindow 类中为 askDir 类调用了 save_dir = AskDir(self).pack(),我还尝试从 class MainWindow 内部调用 save_dir 变量到 doStuff() 函数
猜你喜欢
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
相关资源
最近更新 更多