在主应用程序类之外获取tkinter小部件值?

时间:2018-04-09 22:07:58

标签: python-3.x oop tkinter pygame logic

我有一个pygame项目,它有一个主菜单 - 在所说的菜单中我有它,这样点击 Options 按钮就会触发一个Tkinter UI打开。 UI具有影响游戏速度的OptionMenu小部件。如何在我用于创建Tkinter窗口的类之外检索OptionMenu的值

这是一个简化的问题:

class GUI(object):
    def __init__(self):
        import Tk  # etc...
        # CODE FOR THE PROGRAM WINDOW
        defaultSpeed = StringVar(root)
        speedMenu = OptionMenu(root, defaultSpeed, 'Slow', 'Normal, 'Fast')
        speedMenu.pack()

我知道我需要defaultSpeed.get()才能获得价值。

Pygame菜单有:

click = pygame.mouse.get_pressed()
clicked = click[0] == 1
if "Play" clicked:
   startGame(ticks)
if "Options" clicked:
   options = GUI()

此时^^^我如何以某种方式获得速度(defaultSpeed.get())并将其作为全局变量,以便我可以在startGame函数中使用它来影响上的滴答数时钟?

考虑到这一点,我基本上要求在初始化Tkinter类时如何定义全局变量?

我尝试在GUI()中创建一个名为getSpeed的函数并调用options.getSpeed()但由于某种原因我仍然有一个逻辑错误,这意味着它实际上从未打印/显示/返回。

我知道你在__init__时不应该返回值 - 我应该只移动我的所有Tkinter应用程序。到GUI()内的某个函数并将__init_退出?我当然可以避免将其搞砸?在程序上通过OOP进行编程会更好(允许我在主菜单中简单地调用GUI())吗?

感谢任何帮助解决。

重新调整问题:

  1. 主菜单有2个选项(在Pygame中运行1个游戏,在Tkinter中运行1个选项窗口)
  2. 我需要从选项菜单中获取选项并将其应用于游戏中的变量。
  3. 编辑:我被要求提供最少的代码 我现在很忙,但这里是最小的伪代码 - 所有你需要做的就是创建游戏窗口和菜单的尺寸(它们都是940,500)

    import pygame
    import time
    import math
    import tkinter
    from tkinter import *
    pygame.init()
    
    clock = pygame.tick.Clock()
    ticks = 0
    
    #Here is all the game code
    
    #This function is the main game and includes the game loop
    def StartGame(ticks):
        running = True
        myGame1 = teams()
        myGame1.startTeam()
        #Here is some functions providing the rules of the sport
        def updateBall(ticks):
            theBall.x += float(theBall.speed) * ticks / 1000
        while running:
            myGame1.displayPlayers()
            updateBall(ticks)
            #Calling alot of functions and the game running is here
            ticks = clock.tick(30)
            pygame.display.flip
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                    pygame.quit()
                quit
    
    def game_intro(menu_image):
        intro = True
    
        while intro:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                    pygame.quit()
                    quit
            click = pygame.mouse.get_pressed()
            clicked = click[0] == 1
    
            if 62+288 > mouse[0] > 62 and 150+28 > mouse[1] > 150:
                if clicked:
                    startGame(ticks)
                    pass
    
            elif 62+288 > mouse[0] > 62 and 230+30 > mouse[1] > 230:
                if clicked:
                    options = GUI()
    
    class GUI(object):
        def __init__(self):
            root = self.root = tkinter.Tk
            root.geometry('500x400')
            root.configure(background = '#ffffff')
            speedLabel = tkinter.Message(root, text = 'Game speed: ')
    
            defaultSpeed = StringVar(root)
            speedMenu = OptionMenu(root,defaultSpeed, 'Slow', 'Normal', 'Fast')
    
            speedLabel.grid(row = 0, column = 0)
            speedMenu.grid(row = 0, column = 1)
    
    game_intro(menu_image)
    

1 个答案:

答案 0 :(得分:2)

在创建defaultSpeed

之前
global defaultSpeed

然后在您访问它之前:

global defaultSpeed

它基本上意味着您可以在使用global后从任何地方访问变量。