Что-нибудь мне нужно знать об использовании Tkinter и pygame вместе? - PullRequest
6 голосов
/ 28 ноября 2011

Я использую pygame для написания программы, и мне нужно текстовое поле конфигурации GUI и кнопка для управления. Я уже сделал кнопку, используя Pygame, но я просто могу написать текстовое поле из Pygame. Возможно, мне нужно использовать tkinter вместе с pygame.

Я думаю, что если в 1 окне нет способа сделать часть пигмея и часть tkinter вместе, то я мог бы поместить их в 2 отдельных окна.

Я надеюсь, что часть tkinter может обновить глобальную переменную в моей части pygame, будут ли возникать проблемы? Я мог бы создать дочерний процесс tkinter из части pygame, чтобы часть tkinter могла, вероятно, «увидеть» глобальную переменную в части pygame и изменить их.

Могу ли я сделать это? Есть ли подводные камни?

Ответы [ 3 ]

8 голосов
/ 28 ноября 2011

И Tkinter, и Pygame имеют свои собственные циклы событий, поэтому делать то, что вы хотите, далеко не просто. Проблема в том, что Pygame хочет управлять как экраном, так и событиями, которые пользователь передает на компьютер. Это плохо работает с библиотеками GUI, которые также хотят быть «под контролем».

Я бы посоветовал придерживаться Pygame, у него есть несколько хороших GUI-инструментариев, которые помогут вам создавать кнопки и другие элементы управления. Перейдите эту страницу - она ​​должна прояснить ситуацию. Вы также можете найти это обсуждение полезным.

Помимо практических аспектов, GUI, созданный с помощью Pygame, также ИМХО больше подходит для игры, чем что-то, что делается с помощью Tkinter, поскольку игры обычно имеют оригинальные тематические пользовательские интерфейсы, а не мягкие «текстовое поле + кнопка» окна, которые мы » используется в других приложениях.

Взгляните на некоторые примеры игр на вики-сайте Pygame, многие из них имеют графический интерфейс, и вы можете позаимствовать идеи и код из них.

2 голосов
/ 22 июля 2014
    from tkinter import *
    import pygame
    import random
    import os
    global playing
    playing=False
    def playpause():
        global playing
        if playing==True:
            playing=False
        else:
            playing=True
    root = Tk()
    embed = Frame(root, width=640, height=480)
    embed.grid(row=0,column=2)
    playpausebutton=Button(root, command=playpause, text="Play/Pause")
    playpausebutton.grid(row=1,column=2)
    root.update()
    os.environ['SDL_WINDOWID'] = str(embed.winfo_id())
    os.environ['SDL_VIDEODRIVER'] = 'windib'
    pygame.display.init()
    screen = pygame.display.set_mode((640,480))
    pygame.display.flip()
    while True:
        #your code here
        if playing: 
                screen.fill((random.randint(0,255),random.randint(0,255),random.randint(0,255)))
        pygame.display.flip()
        root.update()

Это прекрасно работает, я успешно использовал этот метод во многих случаях.

0 голосов
/ 15 мая 2014

Я также обнаружил, что pgu ужасен. Тем не менее, то, что вы говорите о захвате цикла tkinter, неправильно. Вы просто вызываете root.update вместо mainloop, и это может быть внутри цикла while для замены mainloop. Отвечая на ваш главный вопрос, однако, есть кое-что, о чем вы должны знать. Кажется, что всякий раз, когда я запускаю две программы рядом друг с другом, происходит следующее отслеживание:

TclError: ожидаемое логическое значение, но получено «-1»

Фатальная ошибка Python: (парашют pygame) Ошибка сегментации

Это приложение запросило Runtime прекратить его необычным способом. Пожалуйста, обратитесь в службу поддержки приложения для получения дополнительной информации.

Из-за этого я бы избегал комбинации, хотя я подозреваю, что эта конкретная проблема может касаться моего использования потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...