2017-03-04 109 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實例? –