【问题标题】:Getting current value when dragging canvas拖动画布时获取当前值
【发布时间】:2019-09-02 01:24:15
【问题描述】:

我正在尝试制作一个简单的纸牌游戏,比如纸牌。 我在编码方面没有经验,所以如果这是一个简单的问题,请原谅我。

我想移动一些画布对象。新对象具有正确的值,但是当我拖动已经存在的卡片时,它显示错误的值(荷兰语中的 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()

所以本质上是在寻找一种将值绑定到画布的方法。

【问题讨论】:

  • 拖动卡片时找不到任何问题。我唯一看到的是,您将在 6 次点击后耗尽您的 deck,从而提高 ValueError

标签: python python-3.x tkinter drag


【解决方案1】:

您上面的代码工作正常,它显示了正确的值,但如果您愿意,可以试试这个

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,第二种会更好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多