我正在尝试使用tkinter制作游戏,它将拥有它自己的特殊鼠标。我见过很多使用它的桌面游戏并且看过相关的问题,但是不知道如何为windows和python 3做这件事。我试着做root['cursor']="@mouse.cur"
但我得到了这个错误:
Traceback (most recent call last):
File "C:/Python32/game.py", line 4, in <module>
root["cursor"]="@mouse.cur"
File "C:\Python32\lib\tkinter\__init__.py", line 1200, in __setitem__
self.configure({key: value})
File "C:\Python32\lib\tkinter\__init__.py", line 1193, in configure
return self._configure('configure', cnf, kw)
File "C:\Python32\lib\tkinter\__init__.py", line 1184, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: bad cursor spec "@mouse.cur"
我在同一目录中有一个名为mouse.cur
的文件,其文件尺寸正确(32x32)并且没有损坏。有人可以告诉我,我是否应该把它放到某种子文件夹中,以其他方式做到这一点。提前致谢。
Windows 10,Python 3.2.2
答案 0 :(得分:1)
我无法在任何Win系统上重现您的问题。但是,尽管存在模糊错误_tkinter.TclError: bad cursor spec "@mouse.cur"
,您仍然可以解决问题。
&#34;错误的光标规格&#34; TkGetCursorByName
函数内发生错误:
...
if (argv[0][0] == '@') {
...
cursorPtr->winCursor = LoadCursorFromFile(&(argv[0][1]));
} else {
...
}
if (cursorPtr->winCursor == NULL) {
ckfree((char *) cursorPtr);
badCursorSpec:
ckfree((char *) argv);
Tcl_AppendResult(interp, "bad cursor spec \"", string, "\"",
(char *) NULL);
return NULL;
} else {
ckfree((char *) argv);
return (TkCursor *) cursorPtr;
}
...
正如您所看到的,问题源于LoadCursorFromFile
,这是此类案例的标准WinAPI函数。
我认为,LoadCursorFromFile(&(argv[0][1]));
会产生Null
结果,因此cursorPtr->winCursor == NULL
会计算为True
,因此会出错。
但是,我们可以在tkinter
之外调用此函数并检查错误:
import ctypes
get_error = ctypes.windll.kernel32.GetLastError
load_cursor = ctypes.windll.user32.LoadCursorFromFileW
cur_handle = load_cursor('mouse.cur')
err = get_error()
print('cursor handle:\t%s, '
'err no:\t%d, '
'err desc:\t%s' % (cur_handle, err, ctypes.FormatError(err)))
cur_handle
不是0
(Null
),err
是0
- 不是我们的情况cur_handle
为0
(Null
),err
为2
- 仔细检查姓名和路径cur_handle
是0
(Null
),err
是0
- 可能是GDI /用户对象泄漏(句柄耗尽)cur_handle
为0
(Null
),err
为8
- 绝对是GDI /用户对象泄露答案 1 :(得分:-1)
尝试使用
root.config(cursor="crosshair")
此外,以下链接可能会为您提供不同类型的游标: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/cursors.html
让我知道这是否也行不通。很乐意提供帮助。