如何从另一个文件的函数中获取值?Python

0 投票
2 回答
1804 浏览
提问于 2025-04-17 23:24

有没有人能帮帮我?

我有两个文件,一个叫 game.py,另一个叫 settings.py。我只想从设置文件里拿一个值来用在游戏里,但我不知道我哪里出错了。

我想要的那个值在一个叫 bbbbb 的函数里...

THIS IS MY SETTINGS
from tkinter import*
import game

class Application(Frame):

    def __init__ (self, master):
        Frame.__init__(self,master)
        self.grid()
        self.create_widgets()

    def bbbbb(self):
        self.xr = self.ball_numbers.get()
        print("printing...", self.xr)
        return self.xr        

    def create_widgets(self):

        self.ball_numbers = IntVar()

        Label(self,text = "Select how many balls you wish to play:").grid()

        Radiobutton(self, text = "1 Ball", variable = self.ball_numbers, value = 1, command = self.bbbbb).grid ()
        Radiobutton(self, text = "2 Balls", variable = self.ball_numbers, value = 2, command = self.bbbbb).grid ()
        Radiobutton(self, text = "3 Balls", variable = self.ball_numbers, value = 3, command = self.bbbbb).grid ()


settings_window = Tk()
settings_window.title(" THE BOUNCER  -  Settings")
settings_window.geometry("600x600")
app = Application(settings_window)
settings_window.mainloop()

我需要这个值在一个叫 handling_settings 的类里,具体是在 create_ball_numbers 这个函数里面。

这是我的 game.py 文件:

from livewires import games, color
from tkinter import*
import settings
import random

games.init(screen_width = 735, screen_height = 350, fps = 35)

class Bounce(games.Sprite):
    def update(self):

        if self.right > games.screen.width or self.left < 0: 
            self.dx = -self.dx

        if self.top < 0:
            self.dy = -self.dy

        if self.bottom == 315 and self.overlapping_sprites: 
            self.dy = -self.dy


class Bar_moving(games.Sprite):
    def update(self):   

        self.x = games.mouse.x  
        self.y = 315

class handling_settings():

    self.yr = bbbbb()
    print("printing number from settings  ", self.yr)

    def create_ball_numbers(self):
        print("inside def", self.yr)



def main():

    background = games.load_image("BG.jpg", transparent = False)
    games.screen.background = background

    call = handling_settings()
    call.create_ball_numbers()

    bar_small = games.load_image("bar_small.jpg", transparent = False)
    the_bar_small = Bar_moving(image = bar_small, x = games.mouse.x)

    games.screen.add(the_bar_small)
    games.mouse.is_visible = False
    games.screen.event_grab = True

    games.screen.mainloop()


main()    


I think I am not using on the right way IMPORT on top of the file.... keeping appearing this msg...

File "C:\Users\Bruno\Desktop\DIT\Object Oriented Programming\GAME - Assignment\game.py", line 3, in <module>
    from settings import bbbbb
ImportError: cannot import name bbbbb

如果我单独运行这两个文件,没问题... 但是当我试图在 settings 文件里的 bbbbb 函数中获取这个值时,我就卡住了...

2 个回答

1

你遇到了一个循环导入的问题;也就是说,settings 文件导入了 game,而 game 又导入了 settings。在这个过程中,两个模块都还没有完全初始化(在 import 语句之后的代码还没有执行)。

其实在 settings 中,你并没有真正使用 game 模块,所以可以直接把 settings.py 中的 import game 这一行删掉。

game.py 中,你导入了 settings,而 bbbbb 是那个模块中 Application 类的一个属性。下面这一行:

self.yr = bbbbb()

在这里是永远无法工作的。

另外,你绝对不应该在 settings 中创建一个新的 Tk() 根窗口;在 Tk 应用程序中,你只能有 一个 主循环。应该让 settings 成为一个由 game 中的主应用程序触发的对话框窗口。

所以,要获取 bbbbb() 的结果,你需要先打开设置对话框,让用户进行交互,然后在用户关闭对话框时再获取 ball_numbers 的设置。

0

首先,不要做循环导入。在settings.py文件中,没必要导入game模块。

因为bbbbbb是Application类中的一个函数,所以不能直接调用。要调用它,我们需要这个类的一个对象,而这个对象已经创建好了,如下所示:

app = Application(settings_window)

所以,在game.py模块中,只需使用app对象来调用bbbbbb()

self.yr = settings.app.bbbbb()

撰写回答