You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类间变量传递问题:如何从Login类获取high_score到Game类

Python类间变量传递问题解决(Login到Game类传递high_score)

问题场景

学习Python类的使用时,尝试将Login类enter方法中获取的high_score变量传递到Game类中,运行代码时触发错误:AttributeError: type object 'Login' has no attribute 'self'。

错误原因

  • Login.self.high_score是错误写法:self是类实例的专属引用,仅能通过类的实例对象访问,不能直接通过类名(Login)调用。
  • Game类初始化时未获取到Login的实例对象,无法直接访问其属性。

解决方案

方法1:直接传递high_score数值

这是最直接的方式,在创建Game实例时将high_score作为参数传入。

修改Login类的open_game方法

假设Login类中有open_game方法用于启动Game窗口,修改为:

def open_game(self):
    # 传入当前实例的high_score给Game
    Game(self.high_score)

修改Game类的初始化方法

from login import Login
import tkinter as tk
from tkinter import messagebox

class Game:
    # 接收传入的high_score参数
    def __init__(self, high_score):
        self.root = tk.Toplevel()
        self.root.geometry('1080x720')

        self.High_score_label = tk.Label(self.root, width=20, font=('Times New Roman', 20, 'bold'), text='High Score')
        self.High_score_label.place(x=440, y=150, width=200, height=50)
        # 使用传入的high_score值,转为字符串避免类型问题
        self.High_score_num = tk.Label(self.root, width=20, font=('Times New Roman', 20, 'bold'), text=str(high_score))

方法2:传递Login实例(适用于需要多个Login属性的场景)

如果后续需要访问Login实例的其他属性,可以直接将Login实例传递给Game。

修改Login类的open_game方法

def open_game(self):
    # 传入当前Login实例
    Game(self)

修改Game类的初始化方法

from login import Login
import tkinter as tk
from tkinter import messagebox

class Game:
    # 接收Login实例参数
    def __init__(self, login_instance):
        self.root = tk.Toplevel()
        self.root.geometry('1080x720')
        # 保存Login实例引用,方便后续访问其他属性
        self.login = login_instance

        self.High_score_label = tk.Label(self.root, width=20, font=('Times New Roman', 20, 'bold'), text='High Score')
        self.High_score_label.place(x=440, y=150, width=200, height=50)
        # 通过Login实例访问high_score属性
        self.High_score_num = tk.Label(self.root, width=20, font=('Times New Roman', 20, 'bold'), text=str(self.login.high_score))

额外优化建议

将Login类enter方法内的导入语句移到文件顶部,避免每次调用方法时重复导入:

# 移到Login类所在文件的顶部
import sqlite3
from user_data import Database
from tkinter import messagebox

class Login:
    # ... 其他代码 ...
    def enter(self):
        db = Database()
        self.username = self.username_entry.get()
        self.password = self.password_entry.get()
        sql = f'SELECT UserPassword, High_Score FROM user WHERE UserName = "{self.username}"'
        db.c.execute(sql)
        result = db.c.fetchall()
        print(result)
        real_password = result[0][0]
        self.high_score = result[0][1]
        print(real_password)
        if self.password == real_password:
            messagebox.showinfo('Login Status',f'Account found High score = {self.high_score}') 
            self.open_game()
            return self.high_score

内容的提问来源于stack exchange,提问作者HurricaneShard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:22:40