2011-11-28 42 views
5

Tôi đang sử dụng pygame để viết chương trình và tôi cần một số trường văn bản cấu hình GUI và nút để điều khiển. Tôi đã thực hiện nút bằng cách sử dụng pygame, nhưng tôi chỉ có thể viết một trường văn bản ra khỏi pygame. Có lẽ tôi cần phải sử dụng tkinter cùng với pygame.Có điều gì tôi cần biết khi sử dụng Tkinter và pygame cùng nhau không?

Tôi nghĩ rằng nếu không có cách nào để thực hiện để pygame một phần và tkinter phần với nhau trong 1 cửa sổ, sau đó tôi có thể đặt chúng vào 2 cửa sổ riêng biệt.

Tôi hy vọng phần tkinter có thể cập nhật biến toàn cầu trong phần pygame của tôi, liệu có vấn đề gì không? Tôi có thể tạo ra một quá trình con của tkinter từ phần pygame để phần tkinter có thể "nhìn thấy" biến toàn cầu trong phần pygame và sửa đổi chúng.

Tôi có thể làm điều này không? Có bất kỳ cạm bẫy nào không?

Trả lời

7

Cả Tkinter và Pygame đều có vòng lặp sự kiện riêng của họ, vì vậy, hãy làm những gì bạn muốn là đơn giản. Vấn đề là Pygame muốn kiểm soát cả màn hình và các sự kiện mà người dùng cấp vào máy tính. Điều này không làm việc tốt với các thư viện GUI, mà cũng muốn được "kiểm soát".

Tôi khuyên bạn nên gắn bó với Pygame, nó có một số bộ công cụ GUI đẹp mắt sẽ giúp bạn tạo các nút và các điều khiển khác. Đi qua this page - nó sẽ xóa mọi thứ. Bạn cũng có thể tìm thấy this discussion hữu ích. Ngoài các khía cạnh thực tế, một GUI được tạo ra với Pygame cũng là IMHO phù hợp hơn cho một trò chơi hơn là một cái gì đó được thực hiện với Tkinter, kể từ khi trò chơi thường có giao diện người dùng ban đầu, thematical và không cửa sổ "nút hộp văn bản + nút nhạt nhẽo" đang được sử dụng trong các ứng dụng khác.

Hãy xem một số trò chơi mẫu trên wiki Pygame, nhiều trò chơi có GUI và bạn có thể mượn ý tưởng và mã từ chúng.

+1

Pygame không có một vòng lặp sự kiện - nó hy vọng bạn viết vòng lặp sự kiện riêng của bạn - vì vậy Nó sẽ là ok để tạo ra một ứng dụng Tkinter từ bên trong một ứng dụng pygame, trừ khi một là toàn màn hình usign cho pygame. Nhưng bạn là đúng int mũ người dùng shoudl sử dụng một số bộ công cụ cho pygame. – jsbueno

+0

@jsbueno: một khi bạn gọi vào Tkinter, vòng lặp sự kiện của nó sẽ kiểm soát. Vậy làm thế nào để bạn chạy nó từ một vòng lặp pygame đang chạy? –

+0

bộ công cụ pgu hút. Không có hướng dẫn và tôi chỉ cố gắng một mình. Bây giờ tôi nghĩ rằng nó đang làm việc và đột nhiên cửa sổ chỉ đóng băng mà không có lý do/ngoại lệ. – lamwaiman1988

0

Tôi cũng thấy pgu thật khủng khiếp. Tuy nhiên, những gì bạn nói về vòng lặp sự kiện tkinter kiểm soát là sai. Bạn chỉ cần gọi root.update thay vì mainloop, và điều này có thể đi vào bên trong một vòng lặp while để thay thế mainloop. Tuy nhiên, hãy trả lời câu hỏi chính của bạn, có điều bạn nên biết. Dường như bất cứ khi nào tôi chạy hai chương trình cùng với nhau, traceback điều này xảy ra:

TclError: dự kiến ​​giá trị boolean nhưng có "-1"

Fatal error Python: (pygame dù) Segmentation Fault

Ứng dụng này đã yêu cầu Thời gian chạy để chấm dứt nó theo cách khác thường. Vui lòng liên hệ với nhóm hỗ trợ của ứng dụng để biết thêm thông tin.

Bởi vì điều này tôi sẽ tránh sự kết hợp, mặc dù tôi nghi ngờ vấn đề cụ thể này có thể liên quan đến việc sử dụng các chủ đề của tôi.

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

Điều này rất tuyệt, tôi đã sử dụng phương pháp này thành công trong nhiều trường hợp.

-1

Có thể thực hiện.

Bản trình diễn trong liên kết bên dưới có Pygame chạy trong một Cửa sổ và Tk trong một cửa sổ khác. Mã bạn nhập vào cửa sổ Tk được thực thi bởi Pygame. Luồng được sử dụng.

Pygame and tkinter running together

Các vấn đề liên quan