自定义鼠标光标Tkinter Windows

时间:2018-04-17 20:12:32

标签: python python-3.x tkinter mouse tk

我正在尝试使用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

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不是0Null),err0 - 不是我们的情况
  • cur_handle0Null),err2 - 仔细检查姓名和路径
  • cur_handle0Null),err0 - 可能是GDI /用户对象泄漏(句柄耗尽)
  • cur_handle0Null),err8 - 绝对是GDI /用户对象泄露

答案 1 :(得分:-1)

尝试使用

root.config(cursor="crosshair")

此外,以下链接可能会为您提供不同类型的游标: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/cursors.html

让我知道这是否也行不通。很乐意提供帮助。