Попытка переместить объект и использование Tkinter в качестве графического интерфейса, но это не работает, когда существует более одного экземпляра класса - PullRequest
0 голосов
/ 23 мая 2018

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

В любом случае, этот код работает, как и предполагалось, пока ядобавьте еще один экземпляр класса AND.Когда я добавляю его в мой код, все сходит с ума.Буду признателен, если вы проверите, как работает мой код с обоими тестовыми экземплярами класса AND и без него.Пока мы занимаемся этим, я был бы очень признателен, если бы кто-нибудь из вас, ребята, смог рассказать мне, как заставить кнопку AND создать новый экземпляр класса (например, в c ++ я бы использовал новый AND, я хочу кое-чтопохоже, когда я нажимаю кнопку).

РЕДАКТИРОВАТЬ: Как кто-то указал, я не был достаточно ясен.То, что я имел в виду, сводит с ума то, что когда я добавляю более 1 экземпляра класса, функция щелчка и перетаскивания, которую я пытаюсь сделать, больше не работает должным образом.Щелчок и перетаскивание больше не работают для одного квадрата, а для другого он будет просто следовать за моей мышью всякий раз, когда я обхожу его, даже если бы я не щелкал.Я действительно верю, что это потому, что у меня есть эта функция int init :

   self.workspace.tag_bind(self.patrat,"<Enter>",self.whileInside)
   workspace.bind("<ButtonRelease-1>",self.onRelease)

Я думаю, что это не относится к этому, но я действительно не знаю, как написать свой код икуда это поставить, если в этом проблема

Вот мой код:

import tkinter as tk
from tkinter import*

def doNothing():
    print("nothing happens bro")

root = Tk()

#========= Drop down menu/toolbar
menu = Menu(root)
root.config(menu=menu)

subMenu = Menu(menu)
menu.add_cascade(label="file", menu=subMenu)
subMenu.add_command(label="New Project...",command=doNothing)
subMenu.add_command(label="New",command=doNothing)
subMenu.add_separator()
subMenu.add_command(label="exit",command=doNothing)

editMenu = Menu(menu)
menu.add_cascade(label="edit", menu=editMenu)
editMenu.add_command(label="redo", command=doNothing)

#========Canvas
workspace=tk.Canvas(root, width=740, height=540,bg="white")
workspace.grid(row=0,column=1)

#====DRAW FUNCTIONS
# Draw rectangle
class AND():

    def __init__(self):
       x=10
       y=10
       self.workspace=workspace
       self.patrat = workspace.create_rectangle(x , y , x + 40 , y + 40,fill = "blue")
       self.workspace.tag_bind(self.patrat,"<Enter>",self.whileInside)
       print("self.workspace.tag_bind(self.patrat,<Enter>,self.whileInside)")
       workspace.bind("<ButtonRelease-1>",self.onRelease)
       print("  workspace.bind(<ButtonRelease-1>,self.onRelease)")

    def whileInside(self,event):
        self.workspace.tag_bind(self.patrat,"<Button-1>",self.onClick)
        print("self.workspace.tag_bind(self.patrat,<Button-1>,self.onClick)")

    def onClick(self,event):
        self.workspace.tag_bind(self.patrat,"<Motion>", self.callback)
        print("self.workspace.tag_bind(self.patrat,<Motion>, self.callback)")

    def onRelease(self,event):
        self.workspace.tag_unbind(self.patrat,"<Enter>")
        print(" self.workspace.tag_unbind(self.patrat,<Enter>)")
        self.workspace.tag_unbind(self.patrat,"<Button-1>")
        print("self.workspace.tag_unbind(self.patrat,<Button-1>)")
        self.workspace.tag_unbind(self.patrat,"<Motion>")
        print(" self.workspace.tag_unbind(self.patrat,<Motion>)")

    def callback(self,event):
        x, y = event.x, event.y
        self.workspace.coords(self.patrat, x, y, x + 40, y + 40)


test=AND()
test2=AND()

#========Left Frame
frame= Frame(root)
frame.grid(row = 0, column = 0, sticky = "n")

leftButton1 = Button(frame,text = "AND",width = 10).grid(row = 1, column = 0)
leftButton2 = Button(frame,text = "OR",width = 10).grid(row = 2, column = 0)
leftButton3 = Button(frame,text = "XOR",width = 10).grid(row = 3, column = 0)
leftButton4 = Button(frame,text = "XNOR",width = 10).grid(row = 4, column = 0)
leftButton5 = Button(frame,text = "NOT",width = 10).grid(row = 5, column = 0)

root.mainloop()

1 Ответ

0 голосов
/ 23 мая 2018

Проблема в том, что команда bind (не tag_bind) не добавляет команду, она заменяет команду.Поэтому, когда ваш второй экземпляр вызывает workspace.bind("<ButtonRelease-1>",self.onRelease), он удаляет его из первого экземпляра.Чтобы добавить команду, вам нужен необязательный третий аргумент, такой как: workspace.bind("<ButtonRelease-1>",self.onRelease, '+')

Однако есть гораздо более простой способ выполнить то, что вы хотите.Событие также включает в себя информацию о кнопках мыши.Так что просто привязывайтесь к движению навсегда и проверяйте кнопку мыши, прежде чем двигаться:

class AND():
    def __init__(self):
        x=10
        y=10
        self.workspace=workspace
        self.patrat = workspace.create_rectangle(x , y , x + 40 , y + 40,fill = "blue")
        self.workspace.tag_bind(self.patrat,"<Motion>",self.on_motion)

    def on_motion(self, event):
        if event.state & 256: # if the left mouse button is down
            x, y = event.x, event.y
            self.workspace.coords(self.patrat, x, y, x + 40, y + 40)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...