python-3.x - Python:在另一个类中调用一个类
问题描述
我是 Python 类和tkinter
. 我正在尝试使用Class CreateToolTip
由@crxguy52 开发的python GUI 工具提示类并实现到GUI 类。GUI 类很简单Label
:Entry
和Button
。
import tkinter as tk
class CreateToolTip(object):
"""
create a tooltip for a given widget
"""
def __init__(self, widget=None, text=None):
self.waittime = 500
self.wraplength = 180
self.widget = widget
self.text = text
self.widget.bind("<Enter>", self.enter)
self.widget.bind("<Leave>", self.leave)
self.widget.bind("<ButtonPress>", self.leave)
self.id = None
self.tw = None
def enter(self, event=None):
self.schedule()
def leave(self, event=None):
self.unschedule()
self.hidetip()
def schedule(self):
self.unschedule()
self.id = self.widget.after(self.waittime, self.showtip)
def unschedule(self):
id = self.id
self.id = None
if id:
self.widget.after_cancel(id)
def showtip(self, event=None):
x = y = 0
x, y, cx, cy = self.widget.bbox("insert")
x += self.widget.winfo_rootx() + 25
y += self.widget.winfo_rooty() + 20
# creates a toplevel window
self.tw = tk.Toplevel(self.widget)
# Leaves only the label and removes the app window
self.tw.wm_overrideredirect(True)
self.tw.wm_geometry("+%d+%d" % (x, y))
label = tk.Label(self.tw, text=self.text, justify='left',
background="#ffffff", relief='solid', borderwidth=1,
wraplength = self.wraplength)
label.pack(ipadx=1)
def hidetip(self):
tw = self.tw
self.tw= None
if tw:
tw.destroy()
class GUI(tk.Frame):
def __init__(self, master=None, Frame=None):
tk.Frame.__init__(self, master)
super(GUI,self).__init__()
self.createWidgets()
self.button_close = tk.Button(text='Close', command=self.quitButton)\
.grid(row=9, column=0, sticky='W', padx=5, pady=5)
self.button_send = tk.Button(text='Send', command=self.sendButton)\
.grid(row=9, column=3, sticky='E', padx=5, pady=5)
def quitButton(self):
self.master.destroy()
import sys
sys.exit()
def sendButton(self):
global alt
alt = self.alt.get()
self.master.destroy()
def createWidgets(self):
import os
# alt
lbl = tk.Label(text='Start at ').grid(row=1, sticky='W')
lbl_ttp = CreateToolTip(lbl,'hello world')
self.alt = tk.Entry(width=12)
self.alt.grid(row=1, column=1)
self.alt.focus()
self.alt.insert(0,'5000')
app = GUI()
app.mainloop()
print (alt)
为了使代码整洁,我保留了原始的 Tooltip 类并创建了一个 GUI。然后它遇到错误:
Traceback (most recent call last):
File "D:/User/test3.py", line 88, in <module>
app = GUI()
File "D:/User/test3.py", line 62, in __init__
self.createWidgets()
File "D:/User/test3.py", line 81, in createWidgets
lbl_ttp = CreateToolTip(lbl,'hello world')
File "D:/User/test3.py", line 13, in __init__
self.widget.bind("<Enter>", self.enter)
AttributeError: 'NoneType' object has no attribute 'bind'
它是由类bind
中的。我应该如何更改声明:
使其有效?谢谢你们。__init__
CreateToolTip
lbl_ttp = CreateToolTip(lbl,'hello world')
解决方案
该错误位于“tk.Label(text='Start at ').grid(row=1,sticky='W')”行。
Label/Button 等对象的 grid 方法返回 None,因此 __init__ 中的“master”也是 None,这就是绑定调用失败的原因。
您可以通过将行更改为来修复它
lbl = tk.Label(text='Start at ')
lbl.grid(row=1, sticky='W')
lbl_ttp = CreateToolTip(lbl,'hello world')
推荐阅读
- python - 在 python 中使用注释时出现语法错误
- c++ - LNK2019 未解析的外部符号 OOP 和多态性?
- sql - 如何根据条件按结果集从组中获取数据?
- python - 将 Python 2.7x 转换为 3.x 兼容性问题:格式和 subprocess.Popen、numpy.array 和浮点数的问题
- oracle - 一列中的多个值显示另一列中的单个值
- java - HttpURLConnection 发送带有自定义标头的 POST 的 401 响应代码
- javascript - 使用map和dataservice同步获取数据
- c# - 如何存储表达式
其中 T :将自定义类转换为表达式 财产? - python - 计算从 for 循环返回的所有值的总值
- eclipse - 为什么 Tycho 将某些 Eclipse 插件包含在物化产品中?