【发布时间】:2015-11-15 10:19:36
【问题描述】:
在编写一些ctypes 兼容的代码时,我需要使用嵌套函数来修改tkinter.Canvas 对象:我想在Canvas 对象中添加和删除文本(以及更多图形)。
但无论如何它不起作用,我被卡住了。
这是我的相关代码:
import tkinter as tk
class BasicGraphics(object):
def __init__(self,*args):
# ...
self.cursor=0
self.max_per_line = 50
self.max_lines = 10
self.h_diff = 15
self.align_l = 90
self.current_display = ["b" * self.max_per_line
for x in range(self.max_lines)]
self.displayed_lines = []
def start_x():
self.root = tk.Tk()
self.canvas = tk.Canvas(self.root,bg="black")
self.canvas.pack()
for line in self.current_display:
self.displayed_lines.append(
self.canvas.create_text(
self.align_l,
self.h_diff * (self.cursor // 10 + 1),
text=line, fill="white"))
print(self.canvas)
def display_lines():
self.canvas.delete("all")
self.canvas.update()
print(self.canvas)
self.displayed_lines = []
lineno = 1
for line in self.current_display:
self.displayed_lines.append(
self.canvas.create_text(
self.align_l,
lineno * self.h_diff * (self.cursor // 10 + 1),
text=line, fill="white"))
lineno += 1
self.canvas.pack() # tried pack and update
def putc():
pos = self.cursor
h = pos//10
w = pos%51
ch = self.char_reg_read() # returns ord("a")
self.current_display[h] = (self.current_display[h][0:w]
+ chr(ch)
+ self.current_display[h][w+1:])
display_lines()
start_x()
putc()
tk.mainloop()
def char_reg_read(self):
return ord("a")
但它甚至没有删除“b”。
由于self 被继承到嵌套函数,它应该可以工作!
(如果您需要,我可以发布更多代码)
【问题讨论】:
-
“它不起作用”是什么意思?你得到了什么?想要什么?将代码简化为导致问题的最小示例。 stackoverflow.com/help/mcve
-
解释“不起作用”。代码在第一次更新之前添加和删除文本,所以不要期望看到和删除。阅读并关注stackoverflow.com/help/mcve。嵌套函数的原因不清楚。无论如何,代码不起作用,因为未定义
self.cursor和self.char_reg_read。未使用display lines is wrong. Delete it. Thelineno` 变量中的canvas.pack;删除它或使用它。可以用current_display = ["b" * self.max_per_line] * self.max_lines代替list comp。 -
@MikeMüller 如您所见,第一行应该显示类似“abbbbbbbbbbbbbb”的内容,但它只是“bbbbbbbbbbbbbbbb”。 那是我的问题!
-
@TerryJanReedy 看看stackoverflow.com/help/formatting 的格式。看我的回答。
标签: python-3.x canvas tkinter nested