3

私はPythonにかなり慣れていないので、tkinterをいじり始めたばかりです。but1.pack()以下のコードを実行すると、 ( NoneTypeobject has no attribute )の属性エラーが発生しますpack。しかし、このエラーがウィンドウの機能に影響を与えていないことがわかる限り、それはまだpackボタンを押しています。ウィンドウは引き続き表示され、すべてのボタンは期待どおりに動作します。

検索すると、他の人がこのエラーを抱えていることがわかりますが、与えられた回答のどれも私の問題を解決しませんでした。あなたが助けてくれることを願っています。

コード:

import tkinter
import ctypes
lst=[]

user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)

def closewindow():
    window.destroy()
def btn1():
    lst.append("Button1")
def btn2():
    lst.append("Button2")

window = tkinter.Tk()

size = str(screensize[0])+'x'+str(screensize[1])
window.geometry(size)

but1 = tkinter.Button(window, text="Button1", command=btn1).grid(column = 1, row = 1)
but2 = tkinter.Button(window, text="Button2", command=btn2).grid(column = 2, row = 1)
ext = tkinter.Button(window, text="Stop", command=closewindow).grid(column = 3, row = 1)

but1.pack()
but2.pack()
ext.pack()

window.mainloop()

コールバック。

Traceback (most recent call last):
  File "C:\Python33\temp.py", line 59, in <module>
    but1.pack()
AttributeError: 'NoneType' object has no attribute 'pack'
4

2 に答える 2

14

のようなエラーが発生した場合は、'NoneType' object has no attribute 'X'値が の変数がありNone、 を実行しようとしていることを意味しますNone.X()。tkinter を使用しているか、他のパッケージを使用しているかは問題ではありません。したがって、「なぜ私の変数は値を持っているのNoneか?」と自問する必要があります。

問題は次の行です。

but1 = tkinter.Button(window, text="Button1", command=btn1).grid(column = 1, row = 1)

Python では、 を実行するとfoo=x(...).y(...)foo最後に呼び出された関数の値が常に保持されます。上記の場合、butは によって返される値を持ち、.grid(column = 1, row = 1)常にgridを返しますNone。したがって、but1isNoneとなり、「''NoneType' object has no attribute 'pack'」となります。

したがって、すぐに修正するには、通話をgrid別の回線に移動します。

but1 = tkinter.Button(window, text="Button1", command=btn1)
but1.grid(column = 1, row = 1)

これで、エラーはなくなります。

ただし、別の問題があります。呼び出しgridてから後で呼び出しpackても、思ったようにはなりません。特定のウィジェットに対して一度に有効にできるジオメトリ マネージャは 1 つだけであり、 と の両方gridpackジオメトリ マネージャです。but1.grid(...)後でを実行すると、最初から呼び出しを行っていないかのように、but1.pack(...)その呼び出しの効果はすべて破棄されます。gridgrid

gridを使用するか、またはを使用するかを決定packし、ルート ウィンドウのすべてのウィジェットに対してどちらか一方のみを使用する必要があります。

于 2013-11-13T12:11:12.453 に答える
2

これを変更してみてください:

but1 = tkinter.Button(window, text="Button1", command=btn1).grid(column = 1, row = 1)

これに:

but1 = tkinter.Button(window, text="Button1", command=btn1)
but1.grid(column = 1, row = 1)

メソッドが.grid()値を返さない可能性があります。

于 2013-11-13T06:38:53.267 に答える