【问题标题】:python pass variable tkinterpython传递变量tkinter
【发布时间】:2017-05-26 04:06:22
【问题描述】:

我是 Python 新手,刚开始学习类和 tkinter,所以请原谅我“凌乱”的代码。 我正在尝试在字段 nr1 中输入一些字符串,单击按钮后,在控制台中打印此字符串并存储此值以供以后使用:

from tkinter import Tk, BOTH, RIGHT, RAISED, BOTTOM, TOP, X, StringVar
from tkinter.ttk import Frame, Button, Entry


class AD(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent, v=None, raw_input=None)
        self.parent = parent
        self.parent.geometry("250x150+300+300")
        self.parent.title("Trolollo")
        self.parent.resizable(False, False)
        self.inp = None
        self.v = StringVar()
        self.raw_input = None

        self.initUI()

    def user_input(self):
        global inp
        a = self.raw_input(self.v.get())
        inp = a
        return inp


    def initUI(self):
        self.pack(fill=BOTH, expand=True)

        frame = Frame(self, relief=RAISED, borderwidth=0)
        frame.pack(fill=BOTH, expand=True)

        self.entry1 = Entry(frame, textvariable=self.v)
        self.entry1.pack(side=TOP, fill=X, expand=False, padx=2, pady=2)
        self.entry1.focus_set()

        rename_button = Button(frame, text="Dispaly text", command =         self.user_input())
        rename_button.pack(side=TOP, expand=False, padx=2, pady=2)

        entry2 = Entry(frame)
        entry2.pack(side=TOP, fill=X, expand=False, padx=2, pady=2)


        quit_button = Button(self, text="Quit", command=self.quit)
        quit_button.pack(side=RIGHT, padx=5, pady=5)

        ok_button = Button(self, text="OK")
        ok_button.pack(side=RIGHT, padx=5, pady=5)


def main():
    root = Tk()


    app = AD(root)
    root.mainloop()


if __name__ == '__main__':
    main()

执行代码后,我得到: TypeError: 'NoneType' 对象不可调用

如有任何帮助,我将不胜感激

【问题讨论】:

  • 简而言之,command = self.user_input() 去掉括号。
  • raw_inputNone 并且您正试图通过在 a=self. 行中使用括号来调用它。不知道你想在那里实现什么。
  • 你用的是python 2还是3?你调用raw_input(),这是python 2,但你导入tkinter,而不是Tkinter,这意味着python 3。然后你标记了问题python-3.5
  • Python 3.5 - raw_input() 有什么替代品吗?编辑:好的,只需input()。仍然无法弄清楚这应该是什么样子
  • Using the variable from entry/button in another function in Tkinter 这是您使用 Entry&Button 从用户那里获取输入并随心所欲使用的方式。

标签: python class variables tkinter python-3.5


【解决方案1】:

问题:

  1. rename_button 的 选项“command=self.user_input()”中的第一个问题。你应该给函数命名 并且不执行该功能。放置 () 符号意味着你 在您的代码加载时执行该函数,即它执行一次 无需按重命名按钮
  2. 第二个问题是您的函数 user_input 中的错误代码。这导致了您的错误消息。

回答:带有建议更正的代码。

from tkinter import *
from tkinter.ttk import *


class AD(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent, v=None, raw_input=None)
        self.parent = parent
        self.parent.geometry("250x150+300+300")
        self.parent.title("Trolollo")
        self.parent.resizable(False, False)
        self.inp = None
        self.v = StringVar()
        self.raw_input = None

        self.initUI()

    def user_input(self):
        # Get entry1 value, store it as an attribute and print to console
        self.raw_input = self.v.get()
        print(self.raw_input)


    def initUI(self):
        self.frame = Frame(self, relief=RAISED, borderwidth=0)
        self.frame.pack(fill=BOTH, expand=True)

        self.entry1 = Entry(self.frame, textvariable=self.v)
        self.entry1.pack(side=TOP, fill=X, expand=False, padx=2, pady=2)
        self.entry1.focus_set()


        #self.rename_button = Button(self.frame, text="Dispaly text",
        #                            command = self.user_input())
        self.rename_button = Button(self.frame, text="Display text",
                                    command = self.user_input)
        self.rename_button.pack(side=TOP, expand=False, padx=2, pady=2)


        # You can remove the triple quotes to display these widgets 
        """
        self.entry2 = Entry(self.frame)
        self.entry2.pack(side=TOP, fill=X, expand=False, padx=2, pady=2)


        self.quit_button = Button(self.frame, text="Quit", command=self.quit)
        self.quit_button.pack(side=RIGHT, padx=5, pady=5)

        self.ok_button = Button(self.frame, text="OK")
        self.ok_button.pack(side=RIGHT, padx=5, pady=5)

        """

        self.pack(fill=BOTH, expand=True)


def main():
    root = Tk()


    app = AD(root)
    root.mainloop()

您的图形用户界面:

建议:

  • 记得放自我。在您的小部件前面。
  • 一次测试一个小部件以帮助您调试代码。

【讨论】:

  • 这正是我想做的——非常感谢。我不确定我是否正确理解了所有内容(函数名称上的 this ())。
  • @Fangir 欢迎。当您在 IDLE 命令行上键入函数的名称时,python 会创建一个函数对象。但是,当您键入函数名称后跟 () 并且名称和 () 之间没有空格时,您将看到 python 运行/执行您的函数(这就像让函数对象完成它的工作)。我的 2 美分值...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多