Python Tkinter面向对象继承

2024-10-02 00:41:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一些值从一个类继承到另一个类。我正在使用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=第一(根)。谢谢你的帮助。你知道吗


Tags: importselfmasterobjectinitdefrandomroot
2条回答

当您对层次结构中最高的类调用super时,它将转到objectobject是Python中所有对象的超类。所以super(First, self).__init__(master)将尝试初始化object,而不是初始化任何类。您可以使用Class.__mro__来查看此继承。弄明白我在说什么。你知道吗

从对象继承?默认情况下,即使没有指定任何内容,也会发生这种情况。所以我猜你想从Frame继承,因为object没有任何意义。你知道吗

所以把你的代码改成这个,它应该是固定的。你知道吗

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()

我在你的例子中看到了几个问题。你知道吗

一:

Second()分配给x,然后调用x.random()x.random2()。这将不起作用,因为您的随机方法只存在于First()类中。你知道吗

二:

不要将函数、方法、变量或属性命名为与内置方法相同的名称。这会引起问题。你知道吗

把你的def print(self)改成def my_print(self)或者其他不完全是print的东西。当我们讨论这个print语句时,您只在First()类中定义self._xself._y,但尝试在Second()类中打印它们。这是行不通的。self始终是对类对象的引用,而不是对传递给类的类控制器的引用。你知道吗

现在我了解了您在这里要做的事情,我将重建您的代码以展示如何在类之间共享信息。你知道吗

不应在Frame类内部使用“几何体管理器”。而是在类变量名上使用它。这将允许您在类的任何几何图形管理器之间进行选择,而不是只使用一种。你知道吗

正如Vineeth所指出的,对于对象类,不能使用supper。你知道吗

下面的代码将运行Second()类,然后当您想引用First()类上的随机方法时,您可以使用我添加到Second()的新方法来实现。如果你有任何问题,请告诉我。你知道吗

最后一个更改是将tkinter作为tk导入,这将有助于防止意外地覆盖从tkinter导入的方法。你知道吗

下面是代码的工作示例:

import tkinter as tk
import random


class First(object):
    def random(self):
        return "From First.Random!", random.randint(11,20), random.randint(1,10)

    def random2(self):
        return "From First.Random2!", self.random()


class Second(tk.Frame):
    def __init__(self, master):
        super(Second, self).__init__(master)
        self.menuFrame = tk.Frame(self)
        self.menuFrame.grid()
        tk.Button(self.menuFrame, font=("consolas", 18, "bold"), text="Main Menu").pack()

    def random(self):
        print(First().random())
    def random2(self):
        print(First().random2())


root = tk.Tk()
root.configure(background='green')

x = Second(root)
x.pack()
x.random()
x.random2()

root.mainloop()

相关问题 更多 >

    热门问题