【问题标题】:TypeError: retrieve() missing 1 required positional argument: 'entry'类型错误:retrieve() 缺少 1 个必需的位置参数:'entry'
【发布时间】:2017-08-01 15:00:53
【问题描述】:

当我尝试使用我创建的检索命令时,我的代码中不断出现此问题,我希望名为“检索”的按钮在输入框中获取信息。这将触发 strGame 命令。

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 1699, in __call__
    return self.func(*args)
TypeError: retrieve() missing 1 required positional argument: 'entry'

我的代码:

from tkinter import *



verif = False
true=True
items=['pistol','knife','sword']
command=False

root=Tk()
root.iconbitmap('GameLogo.ico')

strvar=StringVar()

root.title('RPG Game')
root.geometry('900x600')
root.resizable(False,False)

frame1 = Frame(root, relief=RAISED)
frame1.pack(side=LEFT, fill=Y, padx=10, pady=10)
entry = Entry(frame1).pack(fill=X)
def retrieve(entry):
       result=entry.get()
       return result
retreive = Button(frame1, command=retrieve, text="Click to input").pack(fill=X)

def srtGame():
              try:
                     if retrieve(e1)==str('drop'):
                            print("HELLO")
                            command = True
                            print ("Your inventory:", items)
                            dropItem = input("Which item do you want to drop? ")
                            for i in range(len(items)):
                                   if items[i] == dropItem:
                                          items.remove(dropItem)
                                          print("Your", dropItem,"has been dropped. ")
                                          print("Your inventory", items)
                                          verif = True
                     if verif == False and command == True:
                            print("You don't have that item. Please enter another command.")

              except:
                     IndexError

StartGame = Button(frame1, text="Start game.", relief=RAISED, command=srtGame).pack(fill=X)
GameOutput = Label(frame1, textvariable=strvar, relief=RAISED).pack(fill=X)
root.mainloop()

【问题讨论】:

  • 点击一个按钮是一个事件,所以你可以将event作为参数而不是entry,如果可行的话试试这个
  • 不要将retrieve 用作函数和按钮的名称。
  • 从函数参数中删除entry。除非您有理由接受它作为参数,否则在定义它之后的行。
  • 请在下面查看我的答案,以获取工作代码。此外,我强烈建议您在开始申请之前深入了解。

标签: python


【解决方案1】:

这个程序有很多错误,我会在这里澄清。

无用的变量赋值

类似的行:
widgetVar = Widget(args).geometry(args)

如:
entry = Entry(frame1).pack(fill=X)
retreive = Button(frame1, command=retrieve, text="Click to input").pack(fill=X)

肯定没有按照您的意愿行事。通过将小部件的构造与几何调用链接起来,真正发生的是:Widget(...) 返回一个实例,在该实例上调用pack() 或其他几何管理器,然后返回None

因此所有这些变量都是None,如果您需要存储引用,则应将其分解为两行不同的代码。

不必要的“中间人”

据我了解,您希望您的游戏在单击 Start game 时启动(可能会加载另一个窗口/屏幕)。

当用户直接按下Start game 时,您可以添加代码来检查Entry 的内容,而不是有一个指向Input 的按钮,这实际上并没有什么用处。

了解 Tkinter vars

使用 Tkinter vars 的目的是避免显式访问 Widget 以检查其包含的数据。例如,如果您将StringVar 绑定到Entry,则不再需要直接访问Entry 对象。

混合命令行和 GUI

我建议在 Tkinter 中使用 Dialog,它可用于创建带有文本字段的弹出窗口,以询问用户要删除哪个项目。

工作代码

from Tkinter import *

items = ['pistol', 'knife', 'sword']

root = Tk()

strvar = StringVar()

root.title('RPG Game')
root.geometry('900x600')
root.resizable(False, False)

frame1 = Frame(root, relief=RAISED)
frame1.pack(side=LEFT, fill=Y, padx=10, pady=10)
entry = Entry(frame1, textvariable=strvar)
entry.pack(fill=X)


def srtGame():
    if strvar.get() == str('drop'):
        print("HELLO")
        print("Your inventory:", items)

        # TODO:
        # Use Dialog window to ask for item to drop
        # Let that be stored in `dropItem`
        dropItem = None # Temporary

        # Better than using for loop for this
        if dropItem in items:
            items.remove(dropItem)
            print("Your", dropItem, "has been dropped. ")
            print("Your inventory", items)
        else:
            print("You don't have that item. Please enter another command.")


startButton = Button(
    frame1, text="Start game.", relief=RAISED, command=srtGame)
startButton.pack(fill=X)
GameOutput = Label(frame1, textvariable=strvar, relief=RAISED)
GameOutput.pack(fill=X)

root.mainloop()

【讨论】:

  • 感谢您的固定代码。我目前正在上一门关于 python 的课程,这是第一个项目。我正在尝试学习一些有关 python 的深入信息,但由于这是我使用 tkinter 的第一天,我没有意识到有多少错误。
  • 感谢您发现我的回答很有用。如果可以的话,我建议您首先熟悉 Python(在命令行上),一旦您非常有信心,就转向 GUI。这可以防止压倒新的学习者。当然,除非你时间不够用什么的。
猜你喜欢
  • 2020-12-13
  • 2022-01-11
  • 1970-01-01
  • 2018-09-12
  • 2021-08-05
  • 2021-07-06
  • 2021-08-05
  • 2017-07-23
相关资源
最近更新 更多