python - Python win32com 演示outlookaddin.py 控制按钮标题不起作用
问题描述
直截了当,我尝试使用 Python win32com 演示 OutlookAddin.py,它在 Outlook 2010 中运行良好。
我升级到 Outlook 2016,从那时起,outlookAddin.py 仍在工作,但是它在加载项功能区中添加的加载项 msoControlButton 没有标题。
谁能帮我理解如何解决这个问题。默认情况下,任何安装了 win32com 的人都可以使用该代码,但我仍然在下面给出它以供参考。
from win32com import universal
from win32com.server.exception import COMException
from win32com.client import gencache, DispatchWithEvents
import winerror
import pythoncom
from win32com.client import constants
import sys
# Support for COM objects we use.
gencache.EnsureModule('{00062FFF-0000-0000-C000-000000000046}', 0, 9, 0, bForDemand=True) # Outlook 9
gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 1, bForDemand=True) # Office 9
# The TLB defining the interfaces we implement
universal.RegisterInterfaces('{AC0714F2-3D04-11D1-AE7D-00A0C90F26F4}', 0, 1, 0, ["_IDTExtensibility2"])
class ButtonEvent:
def OnClick(self, button, cancel):
import win32ui # Possible, but not necessary, to use a Pythonwin GUI
win32ui.MessageBox("Hello from Python")
return cancel
class FolderEvent:
def OnItemAdd(self, item):
try:
print("An item was added to the inbox with subject:", item.Subject)
except AttributeError:
print("An item was added to the inbox, but it has no subject! - ", repr(item))
class OutlookAddin:
_com_interfaces_ = ['_IDTExtensibility2']
_public_methods_ = []
_reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER
_reg_clsid_ = "{0F47D9F3-598B-4d24-B7E3-92AC15ED27E2}"
_reg_progid_ = "Python.Test.OutlookAddin"
_reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy"
def OnConnection(self, application, connectMode, addin, custom):
print("OnConnection", application, connectMode, addin, custom)
# ActiveExplorer may be none when started without a UI (eg, WinCE synchronisation)
activeExplorer = application.ActiveExplorer()
if activeExplorer is not None:
bars = activeExplorer.CommandBars
toolbar = bars.Item("Standard")
item = toolbar.Controls.Add(Type=constants.msoControlButton, Temporary=True)
# Hook events for the item
item = self.toolbarButton = DispatchWithEvents(item, ButtonEvent)
item.Caption = "Python"
item.TooltipText = "Click for Python"
item.Enabled = True
# And now, for the sake of demonstration, setup a hook for all new messages
inbox = application.Session.GetDefaultFolder(constants.olFolderInbox)
self.inboxItems = DispatchWithEvents(inbox.Items, FolderEvent)
def OnDisconnection(self, mode, custom):
print("OnDisconnection")
def OnAddInsUpdate(self, custom):
print("OnAddInsUpdate", custom)
def OnStartupComplete(self, custom):
print("OnStartupComplete", custom)
def OnBeginShutdown(self, custom):
print("OnBeginShutdown", custom)
def RegisterAddin(klass):
import winreg
key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Outlook\\Addins")
subkey = winreg.CreateKey(key, klass._reg_progid_)
winreg.SetValueEx(subkey, "CommandLineSafe", 0, winreg.REG_DWORD, 0)
winreg.SetValueEx(subkey, "LoadBehavior", 0, winreg.REG_DWORD, 3)
winreg.SetValueEx(subkey, "Description", 0, winreg.REG_SZ, klass._reg_progid_)
winreg.SetValueEx(subkey, "FriendlyName", 0, winreg.REG_SZ, klass._reg_progid_)
def UnregisterAddin(klass):
import winreg
try:
winreg.DeleteKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Outlook\\Addins\\" + klass._reg_progid_)
except WindowsError:
pass
if __name__ == '__main__':
import win32com.server.register
win32com.server.register.UseCommandLine(OutlookAddin)
if "--unregister" in sys.argv:
UnregisterAddin(OutlookAddin)
else:
RegisterAddin(OutlookAddin)
解决方案
CommandBars
已弃用。Office 2010 是第一个不将命令栏用于 UI 的版本。您可以在以下系列文章中阅读有关 Fluent UI(又名 Ribbon UI)的更多信息:
- 为开发人员自定义 2007 Office Fluent 功能区(第 1 部分,共 3 部分)
- 为开发人员定制 2007 Office Fluent 功能区(第 2 部分,共 3 部分)
- 为开发人员定制 2007 Office Fluent 功能区(第 3 部分,共 3 部分)
自定义 Office UI 的推荐方法是使用 Fluent UI。命令栏保持原位以实现向后兼容性,例如以编程方式执行按钮等。您现在不应该依赖命令栏来创建自定义 UI。
推荐阅读
- c# - 使用动态基地址改装客户端
- rpa - Automation Anywhere - 如何从 Web 屏幕捕获批量 (100s) 列并在不同的子任务之间共享
- c - 如何将给定基数中任意长度整数的字符串表示形式转换为十进制?
- python-3.x - 如何使 mypy 中的通用 TypeVar 成为非可选的?
- reactjs - 如何访问 Material-UI 调色板的浅色或深色?
- firebase - 使用 Fire-base 配置 Unity 项目
- firebase - 为同一项目中的存储桶创建多个 onFinalize 触发器
- linux - 如何加速循环压缩文件夹
- arrays - 如何在 Google 表格中找到弯曲成绩?
- python - 如何按年和月对交易进行分组?