【问题标题】:Get argument of tkinter instance in other module获取其他模块中 tkinter 实例的参数
【发布时间】:2017-08-12 08:16:23
【问题描述】:

我想创建一个通过 GUI 执行以下操作的程序:

1.) 选择将在其中创建一些新目录的目录

2.) 使用条目小部件为这些新目录命名。

由于程序比较大,我想将我的代码分成几个模块,这会给我带来一些问题

到目前为止,我所做的是以下事情:

我有一个“主”程序 using.py

import os, sys
import Tkinter

import tkFileDialog
#import own modules
import Gui

root = Tkinter.Tk()
root.withdraw()


directory='some path'


tempdir = tkFileDialog.askdirectory(parent=root, initialdir=directory, 
     title='Please choose a location for your directory')

n2=Gui.DirectoryCreator()
n2.mainloop()

模块 Gui 看起来像这样

import Tkinter as tk
class DirectoryCreator(tk.Tk):
    text=''
        def __init__(self):
            tk.Tk.__init__(self)
            self.label=tk.Label(self, text='Enter the name of the directory')
            self.entry = tk.Entry(self)
            self.button = tk.Button(self, text="Name Of Folder",width=15, command=self.on_button)
            self.label.grid(row=0,column=0)
            self.button.grid(row=0,column=2)
            self.entry.grid(row=0,column=1)

        def on_button(self):
            text= self.entry.get()
            self.quit()

现在,关键是我需要在模块 using.py 中获取字符串“text”的值。如果我尝试 n2.text 之类的东西,则字符串 n2.text 只是空的,例如n2.text=""。我怎样才能得到这个字符串?

【问题讨论】:

  • 当您尝试获取n2.text 时会发生什么?有错误吗?它是否返回""?究竟是什么不起作用?
  • 是的,它返回 n2.text=""。什么不起作用?我根本不知道如何从 using.py 中的条目小部件访问条目

标签: python class tkinter


【解决方案1】:

on_button 中,使用self.text = self.entry.get()。仅使用text 就像声明一个新变量,而不是使用已经绑定到DirectoryCreator 实例的text

def on_button(self):
    self.text= self.entry.get()
    self.quit()

【讨论】:

  • 好的,这行得通。但我有点惊讶它确实有效。如何定义变量 self.text? self 不总是指向 Tkinter 模块的实例吗?如果是这样,为什么可以声明一个属于该实例的字符串?我没想到 Tkinter 对象可以在定义中拥有一个字符串?除此之外,这仅在我将 self.text 行放在 init 语句之后才有效?为什么这样?如果我把它放在前面,我会卡在主循环中,什么也没有发生
  • self 指的是tk.Tk 的子类。当您说self.text = "" 时,您所做的就是在您的实例上设置一个新属性text。这与您定义self.entry = tk.Entry() 的方式相同。 self.text 只是指向字符串的指针。如果您将其更改为指向其他任何内容,它仍然有效。您可以将self.text 分配给任何数据类型。它不会挑选它可以指向的数据类型。
  • 另外,只有我的答案的第二段才是真正修复它的原因。第一段仅适用于可变数据类型(字符串是不可变的),所以我将从我的答案中删除它,因为这里没有必要。您只需在__init__ 中为lists 和dicts 之类的内容定义一个属性。您可以像在问题中那样定义文本。
  • 如果你把它放在__init__ 声明之后是什么意思?你说的是tk.Tk.__init__(self) 表达式吗?
  • 是的,我就是这个意思。当我把我放在这个陈述之前或之后时,情况就不同了。无论如何,非常感谢您的帮助;)
猜你喜欢
  • 2022-08-22
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2014-07-02
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多