模块中找不到tkinter apply方法

时间:2017-04-23 11:11:20

标签: python user-interface tkinter optionmenu

下面你可以看到我的GUI类中的方法代码。我一直在尝试从列表中创建一个选项菜单,但是我收到了一个错误。它说tkinter没有模块'apply'。在所有示例中,我都可以找到人们使用Tkinter而不是tkinter,那么从python 2.x到3.x的apply方法是否有变化?

我尝试过编写以下所有内容: tk.apply,tk.Apply,apply。但似乎没有任何效果。

import tkinter as tk

class GUI:
     def UploadHomeworkScreen(self):
         self.masternew = tk.Tk()
         self.framenew = tk.Frame(self.masternew)
         self.HomeworkFileEntry = tk.Entry(self.framenew)
         self.ClassVariable = tk.StringVar(self.masternew)
         self.ClassVariable.set(Client.ListOfClasses[0])
         self.ClassChoice = tk.apply(tk.OptionMenu, (self.framenew, self.ClassVariable) + tuple(Client.ListOfClasses))
         self.SubmitButton = tk.Button(self.framenew, text = "Submit", command = self.SubmitHomework)
         self.HomeworkFileEntry.pack(pady = 30, padx = 10)
         self.ClassChoice.pack()
         self.SubmitButton.pack()
         self.framenew.pack()
         self.masternew.mainloop()

如果可能的话,我愿意以另一种方式创建选项菜单。

感谢。

2 个答案:

答案 0 :(得分:1)

注意:apply()在Python 3中不存在。任何使用它的指南(特别是effbot.org上的tkinterbook)都已经过时了。

根据tkinter对class OptionMenu(Menubutton)的定义:

OptionMenu初始化如下:

    def __init__(self, master, variable, value, *values, **kwargs):
            """Construct an optionmenu widget with the parent MASTER, with
            the resource textvariable set to VARIABLE, the initially selected
            value VALUE, the other menu values VALUES and an additional
            keyword argument command."""

考虑到这一点,您的代码行:

     self.ClassChoice = tk.apply(tk.OptionMenu, (self.framenew, self.ClassVariable) + tuple(Client.ListOfClasses))

应更改为:

     self.ClassChoice = tk.OptionMenu(self.framenew, self.ClassVariable, *Client.ListOfClasses)

请注意Client.ListOfClasses前的星号。这是根据https://docs.python.org/3.7/tutorial/controlflow.html#unpacking-argument-lists将OptionMenu所需的菜单VALUES作为列表传递的。

答案 1 :(得分:0)

None函数已在Python 3中删除。[1]不是特定于apply的函数。要解决此问题,请使用tkinter函数的第一个参数作为函数名称,如下所示:

您的代码:

apply

新功能:

self.ClassChoice = tk.apply(tk.OptionMenu, (self.framenew, self.ClassVariable) + tuple(Client.ListOfClasses))

或者如self.ClassChoice = tk.OptionMenu((self.framenew, self.ClassVariable) + tuple(Client.ListOfClasses)) 的文档所述,“ 2to3转换为apply(function, *args, **kwargs)。”