我还没决定在下一个项目中使用哪种语言和工具。我很想使用python,但我想实现功能区工具栏。在Tk(http://www.ellogon.org/petasis/bibliography/Tcl2010/TkRibbon.pdf)中已经完成了一些工作,但看起来它还没有在tkinter中实现。有什么办法可以让它发挥作用吗?
答案 0 :(得分:6)
您需要为此创建一个包装器并获取可以使用的二进制版本。我构建它用于Python 3.4并将其复制到tkribbon1.0-x86_64.zip。你应该在Python / tcl子目录中解压缩这个,这样python使用的tcl版本就可以加载它。
最小包装器如下所示:
from tkinter import Widget
from os import path
class Ribbon(Widget):
def __init__(self, master, kw=None):
self.version = master.tk.call('package','require','tkribbon')
self.library = master.tk.eval('set ::tkribbon::library')
Widget.__init__(self, master, 'tkribbon::ribbon', kw=kw)
def load_resource(self, resource_file, resource_name='APPLICATION_RIBBON'):
"""Load the ribbon definition from resources.
Ribbon markup is compiled using the uicc compiler and the resource included
in a dll. Load from the provided file."""
self.tk.call(self._w, 'load_resources', resource_file)
self.tk.call(self._w, 'load_ui', resource_file, resource_name)
if __name__ == '__main__':
import sys
from tkinter import *
def main():
root = Tk()
r = Ribbon(root)
name = 'APPLICATION_RIBBON'
if len(sys.argv) > 1:
resource = sys.argv[1]
if len(sys.argv) > 2:
name = sys.argv[2]
else:
resource = path.join(r.library, 'libtkribbon1.0.dll')
r.load_resource(resource, name)
t = Text(root)
r.grid(sticky=(N,E,S,W))
t.grid(sticky=(N,E,S,W))
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(1, weight=1)
root.mainloop()
main()
运行它会使用内置于tkribbon dll的资源,看起来像。复杂的一点是将一些Ribbon标记资源放入DLL中进行加载。
您可以使用此示例从现有应用程序加载色带。例如,python Ribbon.py c:\Windows\System32\mspaint.exe MSPAINT_RIBBON
将从mspaint加载功能区资源。必须包含此情况下的资源名称,因为默认值为APPLICATION_RIBBON。对于您自己的功能区,使用uicc构建.rc文件,然后rc /r file.rc
生成.res文件,最后link -dll -out:file.dll file.rc -noentry -machine:AMD64
似乎可以生成仅适用于此扩展的资源DLL。