2017-03-04 56 views
1

下面是通过点击拖动和释放绘制矩形的代码...由于某种原因,它不工作,画布屏幕显示,但矩形没有被绘制?它是root.mainloop()行吗?因为我改变了它,因为我需要绘制弧线和线条,并且不能只有app = rectangle和app.mainloop ...抱歉,我对此很新。绘制矩形tkinter不起作用

from tkinter import Canvas, Tk, mainloop 
import tkinter as tk 
from PIL import Image, ImageTk 

# Image dimensions 
w,h = 800,400 

# Create canvas 
root = Tk() 
canvas = Canvas(root, width = w, height = h, bg='#D2B48C', cursor = "cross") 
canvas.pack() 


class Rectangle(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.x = self.y = 0 
     self.canvas.pack(side="top", fill = "both", expand = True) 
     self.canvas.bind("<ButtonPress-1>", self.press) 
     self.canvas.bind("<B1-Motion>", self.move) 
     self.canvas.bind("<ButtonRelease-1>", self.release) 
     self.rect = None 
     self.start_x = None 
     self.start_y = None 

    def press(self, event): 
     # save mouse drag start position 
     self.start_x = event.x 
     self.start_y = event.y 
     self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, fill="red") 

    def move(self, event): 
     mouseX, mouseY = (event.x, event.y) 

     # expand rectangle as you drag the mouse 
     self.canvas.coords(self.rect, self.start_x, self.start_y, mouseX, mouseY) 

    def release(self, event): 
     pass 

# Other Classes for arc and pencil begin here 

root.mainloop() 

谢谢大家!!!

回答

1

由于@BryanOakley评论,所提供的源代码包含未完成的分析和揭示的Tkinter使用的误解。

问题1 - class Rectangle不需要继承tk.Tk

而是沿用tk.Tkclass Rectangle的,在创建实例添加 Canvas实例。

class Rectangle(): # not inherit from ==> tk.Tk): 
    def __init__(self,canvas): 
     # not initialize a second Tk instance ==> tk.Tk.__init__(self) 
     self.x = self.y = 0 
     # attach the main canvas 
     self.canvas = canvas 
     self.canvas.pack(side="top", fill = "both", expand = True) 

相反的:

class Rectangle(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.x = self.y = 0 
     self.canvas.pack(side="top", fill = "both", expand = True) 

问题2 - 没有class Rectangle的实例已创建。

要使用class Rectangle,一个实例应被创建并附着到canvas实例 !!

之前,在Tk()Canvas() 创建之前移动类声明。

class Rectangle(tk.Tk): 
    def __init__(self): 
... 
    def release(self, event): 
     pass 

# Other Classes for arc and pencil begin here 

root = Tk() 
canvas = Canvas(root, width = w, height = h, bg='#D2B48C', cursor = "cross") 
canvas.pack() 

# create the Rectangle instance 
hRect = Rectangle(canvas) 

root.mainloop() 

相反的:

root = Tk() 
canvas = Canvas(root, width = w, height = h, bg='#D2B48C', cursor = "cross") 
canvas.pack() 

class Rectangle(tk.Tk): 
    def __init__(self): 
... 
    def release(self, event): 
     pass 

# Other Classes for arc and pencil begin here 

root.mainloop() 
+0

好的,这工作。非常感谢!! :) –

0

其中之一,你永远不会创建一个Rectangle类的实例,这是你的所有逻辑的地方。

另一方面,您只能有一个Tk的实例。在问题开始时创建一个,然后如果创建Rectangle的实例,则会创建另一个。再次,你只能有一个。

+0

我如何做到这一点...? –

+0

我应该删除哪个Tk实例? –