0

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を参照)を処理する方法が必要です。助けてください!

参照:

  1. stackoverflow.com/questions/2824041/dynamicly-add-items-to-tkinter-canvas

  2. www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M16

  3. effbot.org/tkinterbook/canvas.htm#performance-issues

4

2 に答える 2

2

これはPythonの問題であり、問​​題ではありませんtkinter。内でローカル変数を定義createWidgetsしましたが、インスタンス属性として設定していません。そのために使用する必要がありますself.foo

>>> class Foo:
...     def __init__(self):
...             bar = "baz"
...
>>> class Bar:
...     def __init__(self):
...             self.bar = "baz"
...
>>> foo = Foo()
>>> foo.bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Foo instance has no attribute 'bar'
>>> bar = Bar()
>>> bar.bar
'baz'

あなたが確かに正しいことに注意してください:問題はのスコープに関係していCanvasます。より正確には、myCan変数のスコープを使用します。クラス変数を定義していなかった場合myCan、ルックアップself.myCanは明らかになりAttributeErrorます。

于 2010-11-27T22:05:22.037 に答える
1

オブジェクト「self.myCan」はありません。使用する前に、キャンバスオブジェクトなどとして作成する必要があります。何をするかによっては、update_idletasks()を呼び出さなければならない場合もあります。

于 2010-11-27T21:03:51.350 に答える