4

Tkinter ウィジェットに元に戻す機能とやり直し機能追加する方法はありますか、またはこのタイプの機能Entryには単一行ウィジェットを使用する必要がありますか?Text

Text後者の場合、ウィジェットをウィジェットとして機能するように構成する際に従うべきヒントはありEntryますか?

微調整が必​​要な機能には、 のトラップ、Return KeyPressタブ キーの押下をフォーカス変更要求への変換、クリップボードから貼り付けられるテキストからの改行の削除などがあります。

4

3 に答える 3

3

Tkinter カスタム エントリを確認します。切り取り、コピー、貼り付けのコンテキスト メニュー、やり直し機能を追加しました。

# -*- coding: utf-8 -*-
from tkinter import *


class CEntry(Entry):
    def __init__(self, parent, *args, **kwargs):
        Entry.__init__(self, parent, *args, **kwargs)

        self.changes = [""]
        self.steps = int()

        self.context_menu = Menu(self, tearoff=0)
        self.context_menu.add_command(label="Cut")
        self.context_menu.add_command(label="Copy")
        self.context_menu.add_command(label="Paste")

        self.bind("<Button-3>", self.popup)

        self.bind("<Control-z>", self.undo)
        self.bind("<Control-y>", self.redo)

        self.bind("<Key>", self.add_changes)

    def popup(self, event):
        self.context_menu.post(event.x_root, event.y_root)
        self.context_menu.entryconfigure("Cut", command=lambda: self.event_generate("<<Cut>>"))
        self.context_menu.entryconfigure("Copy", command=lambda: self.event_generate("<<Copy>>"))
        self.context_menu.entryconfigure("Paste", command=lambda: self.event_generate("<<Paste>>"))

    def undo(self, event=None):
        if self.steps != 0:
            self.steps -= 1
            self.delete(0, END)
            self.insert(END, self.changes[self.steps])

    def redo(self, event=None):
        if self.steps < len(self.changes):
            self.delete(0, END)
            self.insert(END, self.changes[self.steps])
            self.steps += 1

    def add_changes(self, event=None):
        if self.get() != self.changes[-1]:
            self.changes.append(self.get())
            self.steps += 1
于 2016-04-11T09:18:17.800 に答える
2

免責事項:これらは、それを実装する方法について頭に浮かぶ単なる考えです。

class History(object):

    def __init__(self):
        self.l = ['']
        self.i = 0

    def next(self):
        if self.i == len(self.l):
            return None
        self.i += 1
        return self.l[self.i]

    def prev(self):
        if self.i == 0:
            return None
        self.i -= 1
        return self.l[self.i]

    def add(self, s):
        del self.l[self.i+1:]
        self.l.append(s)
        self.i += 1

    def current(self):
        return self.l[self.i]

X 秒 (0.5?) ごとにエントリの状態を保存するスレッドを実行します。

history = History()
...
history.add(stringval.get())

の圧力など、エントリのステータスも保存するイベントを設定することもできますReturn

prev = history.prev()
if prev is not None:
    stringvar.set(prev)

また

next = history.next()
if next is not None:
    stringvar.set(next)

必要に応じてロックを設定するように注意してください。

于 2010-11-10T19:04:05.590 に答える