1つの質問:ボタンのクリックからTkinter Canvasオブジェクトに動的に描画するにはどうすればよいですか?
このトピックは、もともとuser339860(1を参照)によって2つの部分からなる質問として投稿されましたが、質問の2番目の部分はまだ対処されていません。同じ問題が発生しています。具体的には、ボタンイベントからCanvasオブジェクトに描画できません。この質問に答えてもらうと、私とuser339860の2人に役立ちます。ご覧ください。
アプリケーションは、左右に配置された2つのフレームを作成し、2番目のフレームにはCanvasオブジェクトが含まれます。最初のフレームにdrawRectangleという名前の関数/メソッドにバインドされたボタンがあります。アプリケーションは正常に実行され、ボタンをクリックするまで、 create_rectangleメソッドを使用してCanvasオブジェクトに長方形を描画します。ボタンをクリックすると、次のメッセージが表示されます。
tkinter_app_27Nov2010.py "、25行目、drawRectangle self.myCan.create_rectangle(64,64,110,110、fill ='blue')AttributeError:'NoneType'オブジェクトに属性'create_rectangle'がありません
Canvasオブジェクトのスコープと関係があるのではないかと思ったので、Noneに設定したクラスレベルの変数を作成しましたが、問題は解決しませんでした。Canvasの表示リスト(2を参照)について考えましたが、Tkのマニュアルページには、見つけた新しいオブジェクトを追加する方法が反映されていません。
コード:
# tkinter_app_27Nov2010.py
from Tkinter import *
class Application(Frame):
myCan = None
def createWidgets(self):
uiFrame = Frame(self,width=300,height=30)
uiFrame.configure(background='#e0e0e0')
uiFrame.grid(row=0,column=0,sticky=N+S)
outputFrame = Frame(self,width=300,height=300,background='#C0C0C0')
outputFrame.grid(row=0,column=1)
newBtn = Button(uiFrame,text="testing",command=self.drawRectangle)
newBtn.grid(row=0,column=0)
fillLbl = Label(uiFrame,text='-').grid(row=1,sticky=N+S)
newLBL = Label(outputFrame,text="another testing",background='#C0C0C0')
newLBL.grid(row=0)
myCan = Canvas(outputFrame,width=300,height=300,borderwidth=1,relief='sunken')
myCan.grid(row=1)
myCan.create_rectangle(34,34,50,50,fill='red')
def drawRectangle(self):
self.myCan.create_rectangle(64,64,110,110,fill='blue')
def __init__(self,master):
Frame.__init__(self,master)
self.pack()
self.createWidgets()
root = Tk()myApp = Application(master = root)root.title( "Tkinter Testing!")myApp.mainloop()
Tkinter Canvasオブジェクトがそれ自体を更新するために使用する「損傷/修復表示モデル」(3を参照)を処理する方法が必要です。助けてください!
参照:
stackoverflow.com/questions/2824041/dynamicly-add-items-to-tkinter-canvas
effbot.org/tkinterbook/canvas.htm#performance-issues