首页 > 解决方案 > Python Tkinter OOP 继承

问题描述

我正在尝试将一些值从一个类继承到另一个类。我正在使用函数 super 来继承。下面是我的问题的简化版本。谢谢你的帮助。

from tkinter import *
import random
class First(object):
    def __init__(self,master):
        super(First, self).__init__(master)
    def random(self):
        self._y = random.randint(11,20)
        self._x = random.randint(1,10)
    def random2(self):
        s = First(root)
        s.random()


class Second(Frame,First):
    def __init__(self,master):
        super(Second, self).__init__(master)
        self.grid()
        self.menuFrame = Frame(self)
        self.create_menu_widgets()
        self.menuFrame.grid()
    def create_menu_widgets(self):
          btnMainMenu = Button(self.menuFrame,font=("consolas",18,"bold"),text="Main Menu")
          btnMainMenu.pack()
    def print(self):
        print(self._y,self._x)



root = Tk()
x = Second(root)
x.random()
x.random2()
x.print()
root.configure(background   = 'green')
root.mainloop()

我不断收到错误:

super(First, self).__init__(master)
TypeError: object.__init__() takes no parameters

请帮助我,我认为问题出在我有 s=First(root) 的地方。感谢帮助。

标签: pythonpython-3.xtkinter

解决方案


当您调用super层次结构中最高的类时,它将消失objectobject是 Python 中所有对象的超类。因此super(First, self).__init__(master)将尝试初始化object您的任何类。您可以使用Class.__mro__. 弄清楚我在说什么。

并从对象继承?即使您没有指定任何内容,默认情况下也会发生这种情况。所以我想你想继承Frameasobject没有任何意义。

因此,将您的代码更改为此,它应该是固定的。

from tkinter import *
import random
class First(Frame): # changed here
    def random(self):
        self._y = random.randint(11,20)
        self._x = random.randint(1,10)
    def random2(self):
        s = First(root)
        s.random()


class Second(First): # changed here 
    def __init__(self,master):
        super(Second, self).__init__(master)
        self.grid()
        self.menuFrame = Frame(self)
        self.create_menu_widgets()
        self.menuFrame.grid()
    def create_menu_widgets(self):
          btnMainMenu = Button(self.menuFrame,font=("consolas",18,"bold"),text="Main Menu")
          btnMainMenu.pack()
    def print(self):
        print(self._y,self._x)

root = Tk()
x = Second(root)
x.random()
x.random2()
x.print()
root.configure(background   = 'green') # you cannot see this as your button fills everything
root.mainloop()

推荐阅读