【问题标题】:tkinter.Canvas.delete not working with nested functionstkinter.Canvas.delete 不能使用嵌套函数
【发布时间】: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.cursorself.char_reg_read。未使用display lines is wrong. Delete it. The lineno` 变量中的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


【解决方案1】:

我错过了:

来自http://effbot.org/tkinterbook/canvas.htm

create_text(position, **options) [#]

在画布上绘制文本。

位置
文本位置,以两个坐标形式给出。默认情况下,文本以该位置为中心。您可以使用锚选项覆盖它。例如,如果坐标是左上角,则将anchor设置为NW

不幸的是,我的“a”不在画布内(并且不可见),但看起来文本确实正确显示了。

问题实际上与嵌套函数无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2019-12-22
    • 2014-08-31
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多