在 tkinter 中编写一些简单的 gui 应用程序时,我遇到了一些小问题。假设我有自定义菜单小部件(源自 tk.Menu)和自定义画布小部件(源自 tk.Canvas)。
我想从菜单回调函数生成事件并在画布小部件中调用它。我需要这样做,因为将来我想添加更多小部件,这些小部件应该对菜单中的单击位置做出反应。
我试图这样做:
自定义菜单:
class MainMenu(tk.Menu):
def __init__(self, parent):
tk.Menu.__init__(self, parent)
self.add_comand(label='foo', self._handler)
return
def _handler(self, *args):
print('handling menu')
self.event_generate('<<abc>>')
return
Run Code Online (Sandbox Code Playgroud)
自定义画布:
class CustomCanvas(tk.Canvas):
def __init__(self, parent, name=''):
tk.Canvas.__init__(self, parent)
self.bind('<<abc>>', self.on_event)
return
def on_event(self, event):
print(event)
return
Run Code Online (Sandbox Code Playgroud)
当我单击菜单中的位置时,_handler 回调被正确调用并生成事件 <>,但没有调用 on_event 回调。我尝试添加 when='tail' 参数,添加 self.update() 等,但没有任何结果。有人知道怎么做吗?
我在Python 3中遇到了ttk.Treeview的问题.如果我尝试插入包含换行符的值的项目,树视图作物项目并且只显示第一行文本,而不是制作多行项目.是否有可能以某种方式配置treeview来显示它?我想避免实现新类或将每个新行添加为子项.我知道可以编辑Treeview样式,例如设置'rowheight',但不同的项目可能有不同数量的换行符.这是示例代码:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
tv = ttk.Treeview(root, columns=['a','b'])
values = ['one', 'one \ntwo \nthree']
tv.insert('', 'end', values=values)
tv.insert('', 'end', values=values)
tv.pack()
Run Code Online (Sandbox Code Playgroud)
总结问题是:如何设置不同的rowheight取决于项目值中的换行符数量.
我在使用带有'vista'主题的tkinter ttk为Combobox设置背景色时遇到问题(我正在使用Python 3)。我已经在这里尝试了代码ttk。当状态为只读且没有焦点时组合框故障
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
combo = ttk.Combobox(root, values=['1', '2', '3'])
combo['state'] = 'readonly'
combo.pack()
tk.Entry(root).pack()
style = ttk.Style()
style.map('TCombobox', selectbackground=[('readonly', 'red')])
#style.map('TCombobox', fieldbackground=[('readonly', 'blue')]) #not working as well
Run Code Online (Sandbox Code Playgroud)
但这只会更改文本的背景,组合框的其余部分将变为白色。我还在tcl论坛上看到了一个帖子:http : //wiki.tcl.tk/15780,我尝试使用“ fieldbackground”,但是tkinter似乎忽略了此参数。您知道如何解决吗?也许有一种方法可以仅在特定主题中配置特定样式?我看到对于“默认”主题,如果状态为“只读”,则背景变为灰色。