Получение текущего значения при перетаскивании холста - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь сделать простую карточную игру, что-то вроде пасьянса.У меня нет опыта в программировании, поэтому простите меня, если это простой вопрос.

Я хочу переместить некоторые объекты холста.Новые объекты имеют правильное значение, но когда я перетаскиваю уже существующую карту, это показывает неправильное значение (waarde на голландском языке).Я хотел бы связать значение (waarde) с картой, но не знаю, как это сделать ...

Мысли о тегах, привязке, ID ....

from tkinter import *
from random import randint

window = Tk()

deck = [1,2,3,4,5,6]

def pakkaart():
    rand_card = randint(0,len(deck)-1)
    global waarde
    waarde = deck[rand_card]
    deck.pop(rand_card)
    global kaart
    kaart = Canvas(window, width = 40, height = 40, bg='yellow')
    kaart.place(x=50, y=50, anchor=CENTER)
    kaart.create_text(20,20,text=(waarde))
    kaart.bind("<B1-Motion>", drag)


def drag(event):
    event.widget.place(x=event.x_root, y=event.y_root,anchor=CENTER)    
    print(waarde)

button1 = Button(window, text="Nieuwe Kaart", command=pakkaart)
button1.pack()

window.mainloop()

Так что, в сущности, ищем способ привязать значение к холсту.

1 Ответ

0 голосов
/ 11 апреля 2019

Ваш код выше работает нормально, он показывает правильное значение, но если вы хотите, вы можете попробовать это

from tkinter import *
from random import randint

window = Tk()
ws = window.winfo_screenwidth()
hs = window.winfo_screenheight()
w = 500  # width for the Tk root
h = 300  # height for the Tk root
x = (ws / 2) - (w / 2)
y = (hs / 2) - (h / 2)

window.geometry('%dx%d+%d+%d' % (w, h, x, y))

deck = [1, 2, 3, 4, 5, 6]


def pick_card():
    global waarde, kaart
    rand_card = randint(0, len(deck)-1)
    card_number = deck[rand_card]
    deck.remove(card_number)
    card = Canvas(window, width=40, height=40, bg='yellow')
    card.place(x=50, y=50, anchor=CENTER)
    card_number_text = card.create_text(20, 20, text=card_number, tags=card_number)
    card.bind("<Button-1>", lambda event: get_number(event, card_number_text))  # or you can use: card.bind("<Button-1>", lambda event: print(card_number))
    card.bind("<B1-Motion>", drag)


def drag(event):
    # This is better for move a widget
    cx = window.winfo_pointerx() - window.winfo_rootx()
    cy = window.winfo_pointery() - window.winfo_rooty()
    event.widget.place(x=cx, y=cy)

def get_number(event, number):
    print(event.widget.itemcget(number, "text"))


button1 = Button(window, text="Generate Card", command=pick_card)
button1.pack()


window.mainloop()

Я изменил функцию drag(event) и написал два способа получить текущее значение карты, для хранения вы можете использовать немного global varibles или создать class, второе будет лучше

...