python - 如何在单独的类中引用我的窗口变量?
问题描述
我正在使用 python 的街机库,但我不断收到“NameError:name 'window' is not defined”错误。我尝试删除主要功能并运行
window = MyGame()
for button in window.buttonList:
button.draw()
arcade.run()
没有它周围的功能,但现在我需要在不使用 os.exec 或 subprocess 的情况下从另一个文件运行它,同时仍然能够返回并运行第一个文件。我需要使用 main 函数,但我不知道如何在不引发错误的情况下执行此操作。这是我的代码
from subprocess import call
from tkinter import *
from tkinter import filedialog
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 600
SCREEN_TITLE = "Menu"
class MenuItem():
def __init__(self, x, y, width, height):
self.x = x
self.y = y
self.width = width
self.height = height
def draw(self):
pass
def func(self):
pass
class FreeDraw(MenuItem):
def func(self):
window.close()
window.set_visible(False)
#run other file
def draw(self):
window.buttonShapes.append(arcade.create_rectangle_outline(self.x, self.y, self.width, self.height, arcade.color.BLACK))
class MyGame(arcade.Window):
""" Our custom Window Class"""
def __init__(self):
""" Initializer """
# Call the parent class initializer
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
# Set the working directory (where we expect to find files) to the same
# directory this .py file is in. You can leave this out of your own
# code, but it is needed to easily run the examples using "python -m"
# as mentioned at the top of this program.
file_path = os.path.dirname(os.path.abspath(__file__))
os.chdir(file_path)
self.buttonList = [FreeDraw(SCREEN_WIDTH/2, 100, 400, 100)]
self.buttonShapes = arcade.ShapeElementList()
arcade.set_background_color(arcade.color.ASH_GREY)
def setup(self):
pass
def on_draw(self):
""" Draw everything """
arcade.start_render()
arcade.draw_text("Free Draw", (self.buttonList[0].x - self.buttonList[0].width / 2) + 115,
self.buttonList[0].y - 25,
arcade.color.BLACK, 30)
self.buttonShapes.draw()
def on_key_press(self, key, modifiers):
pass
def on_key_release(self, key, modifiers):
pass
def on_mouse_motion(self, x: float, y: float, dx: float, dy: float):
pass
def on_mouse_release(self, x: float, y: float, button: int,
modifiers: int):
for button in self.buttonList:
if x <= button.x + (button.width / 2) and x >= button.x - (button.width / 2):
if y <= button.y + (button.height / 2) and y >= button.y - (button.height / 2):
button.func()
self.buttonList[0].func()
def main():
window = MyGame()
for button in window.buttonList:
button.draw()
arcade.run()
main()
解决方案
您可以在单独的类中使用arcade.View
而不是。arcade.Window
例子:
import arcade
class View1(arcade.View):
def on_draw(self):
arcade.start_render()
arcade.draw_text('View 1', 300, 200, arcade.color.RED, font_size=30, anchor_x='center')
def on_mouse_press(self, _x, _y, _button, _modifiers):
self.window.show_view(View2())
class View2(arcade.View):
def on_draw(self):
arcade.start_render()
arcade.draw_text('View 2', 300, 200, arcade.color.RED, font_size=30, anchor_x='center')
def on_mouse_press(self, _x, _y, _button, _modifiers):
self.window.show_view(View1())
window = arcade.Window(600, 400)
window.show_view(View1())
arcade.run()
输出:
推荐阅读
- firebase - 为什么我不能遍历 Firebase Img URL 列表,但可以单独访问每个?
- c# - 字符计数器程序
- python - python3 ModuleNotFound
- python - 为什么我的while循环中包含“c”的变量不等于“c”?当输入匹配时尝试中断
- java - Java - 从 JFrame 中移动选定的对象
- r - 过滤掉R中只有一个句点的所有行
- dynamics-crm - 在 Dynamics 365 示例中无法解析远程名称
- ios - 在 didFinishLaunchingWithOptions 检查无效的用户令牌火力库
- windows - 如何在 Windows EC2 实例上运行 Minikube?
- python - 当模型位于版本子目录中时,Django 转储数据返回空数组