0

tkinter の aa フレームに埋め込まれた pygame ウィンドウがあります。別のフレームには、クリックすると次の関数を呼び出すボタンがあります。

def setStart():
global start
# set start position
for event in pygame.event.get():
    if event.type == pygame.MOUSEBUTTONUP:
        start = event.pos
        print("start",start)
        break

ボタンがクリックされた後、ユーザーがpygameサーフェスでクリックした場所の位置をプログラムが出力することを意図しています。ただし、ボタンの最初のクリックと次の pygame サーフェスのクリックでは、出力はありません。Python が次のような出力を出力するのは、pygame サーフェスで対応する 2 回目のクリックの前にボタンを2 回クリックしたときです。

('開始', (166, 115))

pygame サーフェスをクリックした直後に結果を得るにはどうすればよいですか? 私は2つの別々のtkinterとpygameウィンドウを持っていたときに同じ問題を抱えていたので、tkinterへのpygameの埋め込みが問題の原因になる可能性は低いです。

編集:さらにテストした後、ボタンが押されてからpygameサーフェスが複数回クリックされた場合、ボタンを2回クリックすると、これらすべてのクリックの座標がバッチとして出力されるようです。

4

2 に答える 2

1

最も基本的な形式では、pygame でそれを行う方法は次のとおりです。

import pygame
pygame.init()

screen = pygame.display.set_mode((100, 100))
clock = pygame.time.Clock()

while True:
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONUP:  # or MOUSEBUTTONDOWN depending on what you want.
            print(event.pos)
        elif event.type == pygame.QUIT:
            quit()

    pygame.display.update()

pygame イベントの処理方法の詳細については、docsを参照してください。

そして、tkinterでそれを行う方法は次のとおりです。

try:
    import tkinter as tk  # Python 3
except ImportError:
    import Tkinter as tk  # Python 2

root = tk.Tk()

def print_pos(event):
    print(event.x, event.y)

root.bind("<Button-1>", print_pos)
root.mainloop()

tkinterイベントの詳細については、effbots のドキュメントを参照してください。

pygame にイベントループを入れないことをお勧めします。breakこれを行うと、他のすべてのイベントが処理されなくなります。つまり、プログラムが特定のイベントに応答しない可能性があります。

あなたが私たちに与えたコードを考えると、あなたの「EDIT:[...]」は残念ながら間違っています。コードに問題はありませんでした。マウス ボタンを離した位置を出力し、常に 1 つの位置だけを出力しました。したがって、コードのどこかに論理エラーがなければなりません。

于 2016-09-23T12:37:14.667 に答える