Search code examples
pythonpython-importtrace

Why does my python script run normally, but not when i'm trying to trace it?


I'm making a game with pygame, but I ran into some issues. The game often slows down, for no apparent reason, so I tried to trace it with the trace module built into python. For some reason however, it works perfectly when I execute it normally with

py  main.py

but when i do

py -m trace --trace main.py

it gives me the following error:

File "F:\Downloads\Tanks (2)\Tanks\Tanks\Scripts\render.py", line 13, in load_UI
play_online_button = pgGui.elements.UIButton(pg.Rect((362  * main.res_multiplier, 200 * main.res_multiplier), (300 * main.res_multiplier, 60 * main.res_multiplier)), "Speel Online", main.UI_manager)
AttributeError: module '__main__' has no attribute 'res_multiplier'

While, as seen below, the attribute res_multiplier is obviously created before load_UI() runs. Could this be because i'm importing other scripts?

Here are the relevant pieces of code:

import Scripts.render as render

def start_game():
    WIDTH = 1024
    HEIGHT = 576
    
    global res_multiplier 
    res_multiplier = WIDTH / 1024

    #I skipped a bunch of stuff here

    render.load_UI()

    while running:
        #main game loop

if __name__ == __main__:
    start_game()

And the relevant function:

def load_UI():
    global fullscreen
    fullscreen = False
    
    #Startmenu
    global play_local_button, play_online_button, res_menu, quit_button
    play_online_button = pgGui.elements.UIButton(pg.Rect((362  * main.res_multiplier, 200 * main.res_multiplier), (300 * main.res_multiplier, 60 * main.res_multiplier)), "Speel Online", main.UI_manager)
    play_local_button = pgGui.elements.UIButton(pg.Rect((362  * main.res_multiplier, 290 * main.res_multiplier), (300 * main.res_multiplier, 60 * main.res_multiplier)), "Speel Lokaal", main.UI_manager)
    res_menu = pgGui.elements.UIDropDownMenu(["1920x1080","1600x900","1366x768","1280x720", "1024x576"], "1024x576", pg.Rect((700  * main.res_multiplier, 20 * main.res_multiplier), (300 * main.res_multiplier, 30 * main.res_multiplier)), main.UI_manager)
    quit_button = pgGui.elements.UIButton(pg.Rect((0  * main.res_multiplier, 0 * main.res_multiplier), (140 * main.res_multiplier, 40 * main.res_multiplier)), "Spel verlaten", main.UI_manager)
    
    #Onlinemenu
    global ip_text_entry, port_text_entry, connect_button, back_button, connect_error_text, client_port_text_entry
    ip_text_entry = pgGui.elements.UITextEntryLine(pg.Rect((362  * main.res_multiplier, 200 * main.res_multiplier), (300 * main.res_multiplier, 20 * main.res_multiplier)), main.UI_manager)
    ip_text_entry.set_text("127.0.0.1")
    port_text_entry = pgGui.elements.UITextEntryLine(pg.Rect((362  * main.res_multiplier, 240 * main.res_multiplier), (300 * main.res_multiplier, 20 * main.res_multiplier)), main.UI_manager)
    port_text_entry.set_text("1234")
    client_port_text_entry = pgGui.elements.UITextEntryLine(pg.Rect((362  * main.res_multiplier, 280 * main.res_multiplier), (300 * main.res_multiplier, 20 * main.res_multiplier)), main.UI_manager)
    client_port_text_entry.set_text("1235")    
    connect_button = pgGui.elements.UIButton(pg.Rect((362  * main.res_multiplier, 320 * main.res_multiplier), (300 * main.res_multiplier, 50 * main.res_multiplier)), "Verbinden & Spelen", main.UI_manager)
    back_button = pgGui.elements.UIButton(pg.Rect((0  * main.res_multiplier, 0 * main.res_multiplier), (260 * main.res_multiplier, 40 * main.res_multiplier)), "Terug naar het startmenu", main.UI_manager)
    connect_error_text = pgGui.elements.UITextBox("We kunnen geen verbinding maken met de server. Controleer of de server op het goede ip en poort is ingesteld en of je ze hier goed hebt ingevuld.", pg.Rect((690  * main.res_multiplier, 200 * main.res_multiplier), (300 * main.res_multiplier, 130 * main.res_multiplier)), main.UI_manager)
    hide_list = [ip_text_entry, port_text_entry, connect_button, back_button, connect_error_text, client_port_text_entry]
    for x in hide_list:
        x.hide()

Solution

  • You should pass res_multiplier as a parameter:

    #main
        render.load_UI(res_multiplier)
    
    #render
    def load_UI(res_multiplier):
        global fullscreen
        fullscreen = False
        
        #Startmenu
        global play_local_button, play_online_button, res_menu, quit_button
        play_online_button = pgGui.elements.UIButton(pg.Rect((362  * res_multiplier, 200 * res_multiplier), (300 * res_multiplier, 60 * res_multiplier)), "Speel Online", main.UI_manager)