2011-11-28 6 views
5

Używam pygame do napisania programu i potrzebuję trochę pola tekstowego konfiguracji GUI i przycisku do sterowania. Już zrobiłem przycisk za pomocą pygame, ale mogę po prostu napisać pole tekstowe z pygame. Być może muszę użyć tkintera razem z pygame.Czy jest coś, czego potrzebuję świadomy używania razem Tkinter i pygame?

Myślę, że jeśli nie ma możliwości wykonania części do pygame i części tkinter w jednym oknie, mógłbym umieścić je w 2 osobnych oknach.

Mam nadzieję, że część tkinter może zaktualizować zmienną globalną w mojej części pygame, czy byłby jakiś problem? Mógłbym stworzyć proces potomny tkintera z części pygame tak, że część tkintera prawdopodobnie "zobaczy" zmienną globalną w części pygame i zmodyfikuje je.

Czy mogę to zrobić? Czy są jakieś pułapki?

Odpowiedz

7

Zarówno Tkinter, jak i Pygame mają własne pętle zdarzeń, więc robienie tego, co chcesz, nie jest proste. Problem polega na tym, że Pygame chce kontrolować zarówno ekran, jak i zdarzenia, które użytkownik wprowadza do komputera. To nie działa dobrze z bibliotekami GUI, które również chcą być "pod kontrolą".

Proponuję trzymać się Pygame, ma kilka ładnych zestawów narzędzi GUI, które pomogą ci stworzyć przyciski i inne elementy sterujące. Przejdź powyżej this page - powinien to wyjaśnić. Użyteczne może być także użycie this discussion.

Oprócz praktycznych aspektów, GUI utworzone za pomocą Pygame jest również IMHO bardziej odpowiednie dla gry niż coś, co zrobiono z Tkinter, ponieważ gry mają zwykle oryginalne, tematyczne interfejsy użytkownika, a nie mdłe "okno z tekstem + przyciski", które mamy "przyzwyczaił się do innych aplikacji.

Spójrz na niektóre z przykładowych gier na wiki Pygame, wiele z nich ma graficzny interfejs użytkownika i możesz pożyczyć od nich pomysły i kod.

+1

Pygame nie ma pętli zdarzenia - to oczekuje, aby napisać własną pętlę zdarzeń - tak byłoby OK, aby utworzyć aplikację tkinter od wewnątrz aplikacji Pygame, chyba że ktoś jest usign fullscreen dla pygame. Ale masz rację, że użytkownik powinien użyć jakiegoś zestawu narzędzi do pygame. – jsbueno

+0

@jsbueno: po wywołaniu Tkintera, jego pętla zdarzeń przejmuje kontrolę. Jak więc uruchomić go z działającej pętli pygame? –

+0

the pgu toolkit sucks. Bez samouczka i próbuję sam. Teraz myślę, że działa i nagle okno po prostu zamarza bez powodu/wyjątku. – lamwaiman1988

0

Znalazłem również pgu jest okropne. Jednak to, co mówisz o kontroli pętli zdarzeń, jest błędne. Wystarczy wywołać root.update zamiast mainloop, a to może wejść w pętlę while, aby zastąpić główny. Odpowiadając jednak na główne pytanie, jest coś, o czym powinieneś wiedzieć. Wydaje się, że ilekroć uruchomić dwa programy obok siebie, to traceback następuje:

TclError: Oczekuje wartość logiczną, ale dostał "-1"

Błąd krytyczny Python (pygame spadochron) Segmentacja Fault

Ta aplikacja zażądała, aby środowisko wykonawcze zakończyło ją w nietypowy sposób. Aby uzyskać więcej informacji, skontaktuj się z zespołem pomocy technicznej aplikacji.

Z tego powodu uniknęłoby to połączenia, chociaż podejrzewam, że ten konkretny problem może dotyczyć mojego wykorzystania wątków.

2
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() 

To działa doskonale, użyłem tej metody z powodzeniem w wielu przypadkach.

-1

Można to zrobić.

Demo w poniższym łączu zawiera Pygame działające w jednym oknie, a Tk w innym. Kod wpisywany w oknie Tk jest wykonywany przez Pygame. Używane jest gwintowanie.

Pygame and tkinter running together

Powiązane problemy