Python t按键时可循环浏览列表

Python t按键时可循环浏览列表,python,tkinter,Python,Tkinter,我正在尝试用tkinter Entry小部件和上/下箭头键创建命令历史记录。这是一个非常基本的泥浆客户,我正试图在我的业余时间 # The list that hold the last entered commands. self.previousCommands = [] # Binding the up arrow key to the Entry widget. self.view.Tabs.tab1.E.bind('<Up>', self.checkCommandHist

我正在尝试用tkinter Entry小部件和上/下箭头键创建命令历史记录。这是一个非常基本的泥浆客户,我正试图在我的业余时间

# The list that hold the last entered commands.
self.previousCommands = []

# Binding the up arrow key to the Entry widget.
self.view.Tabs.tab1.E.bind('<Up>', self.checkCommandHistory)

# The function that should cycle through the commands.
def checkCommandHistory(self, event):
    comm = self.previousCommands[-1]
    self.view.Tabs.tab1.E.delete(0, END)
    self.view.Tabs.tab1.E.insert(0, comm)
#保存最后输入的命令的列表。
self.previousCommands=[]
#将向上箭头键绑定到条目小部件。
self.view.Tabs.tab1.E.bind(“”,self.checkCommandHistory)
#应循环执行命令的函数。
def checkCommandHistory(自身、事件):
comm=self.previousCommands[-1]
self.view.Tabs.tab1.E.delete(0,结束)
self.view.Tabs.tab1.E.insert(0,comm)
基本上,我正在尝试通过使用向上和向下箭头键循环浏览一个列表,该列表包含最后输入的命令的历史记录。这种行为在大多数MUD客户机中很常见,但我看不出这是如何实现的


使用上面的代码,我可以将向上箭头键绑定到Entry小部件,并在按下时插入最后输入的命令。如果我继续按向上箭头键,我希望它继续循环执行列表中最后输入的命令。

这是一个非面向对象的版本

import tkinter as tk

root = tk.Tk()

history = []
history_index = -1

def runCommand(event):
    command = cmd.get()
    print("Running command: {}".format(command))
    cmd.set("")
    history.append(command)
    history_index = -1
    print(history)

def cycleHistory(event):
    global history_index
    if len(history):
        try:
            comm = history[history_index]
            history_index -= 1
        except IndexError:
            history_index = -1
            comm = history[history_index]
        cmd.set(comm)

cmd = tk.StringVar(root)
e = tk.Entry(root,textvariable=cmd)
e.grid()
e.bind("<Return>",runCommand)
e.bind("<Up>",cycleHistory)
e.focus()

root.mainloop()
将tkinter作为tk导入
root=tk.tk()
历史=[]
历史指数=-1
def runCommand(事件):
command=cmd.get()
打印(“正在运行的命令:{}”。格式化(命令))
cmd.set(“”)
append(命令)
历史指数=-1
印刷品(历史)
def循环历史记录(事件):
全球历史指数
如果是len(历史记录):
尝试:
comm=历史[历史索引]
历史指数-=1
除索引器外:
历史指数=-1
comm=历史[历史索引]
命令集(命令)
cmd=tk.StringVar(根)
e=tk.Entry(根,textvariable=cmd)
e、 网格()
e、 绑定(“,runCommand)
e、 绑定(“,循环历史记录)
e、 焦点()
root.mainloop()
基本上,您只需要记录下下次用户按下向上箭头时应该显示的历史记录中的哪个项目。我使用
history\u index
字段来执行此操作
history\u index
最初设置为-1,每次访问它时,它将递减1

我使用
except indexer-ror
异常将索引重置为-1,一旦没有更多的历史可从列表中读取并重新从头开始


按return键,运行命令,将其添加到历史记录中,并将索引重置为-1。

这是一个非OOP版本

import tkinter as tk

root = tk.Tk()

history = []
history_index = -1

def runCommand(event):
    command = cmd.get()
    print("Running command: {}".format(command))
    cmd.set("")
    history.append(command)
    history_index = -1
    print(history)

def cycleHistory(event):
    global history_index
    if len(history):
        try:
            comm = history[history_index]
            history_index -= 1
        except IndexError:
            history_index = -1
            comm = history[history_index]
        cmd.set(comm)

cmd = tk.StringVar(root)
e = tk.Entry(root,textvariable=cmd)
e.grid()
e.bind("<Return>",runCommand)
e.bind("<Up>",cycleHistory)
e.focus()

root.mainloop()
将tkinter作为tk导入
root=tk.tk()
历史=[]
历史指数=-1
def runCommand(事件):
command=cmd.get()
打印(“正在运行的命令:{}”。格式化(命令))
cmd.set(“”)
append(命令)
历史指数=-1
印刷品(历史)
def循环历史记录(事件):
全球历史指数
如果是len(历史记录):
尝试:
comm=历史[历史索引]
历史指数-=1
除索引器外:
历史指数=-1
comm=历史[历史索引]
命令集(命令)
cmd=tk.StringVar(根)
e=tk.Entry(根,textvariable=cmd)
e、 网格()
e、 绑定(“,runCommand)
e、 绑定(“,循环历史记录)
e、 焦点()
root.mainloop()
基本上,您只需要记录下下次用户按下向上箭头时应该显示的历史记录中的哪个项目。我使用
history\u index
字段来执行此操作
history\u index
最初设置为-1,每次访问它时,它将递减1

我使用
except indexer-ror
异常将索引重置为-1,一旦没有更多的历史可从列表中读取并重新从头开始

按return键,运行命令,将其添加到历史记录中,并将索引重置为-1

问题:按绑定到
条目
小部件的
向上
/
向下
箭头键,循环列表中的元素

创建一个继承自
tk.Entry
类对象

import tkinter as tk

class EntryHistory(tk.Entry):
    def __init__(self, parent, init_history=None):
        super().__init__(parent)
        self.bind('<Return>', self.add)
        self.bind('<Up>', self.up_down)
        self.bind('<Down>', self.up_down)

        self.history = []
        self.last_idx = None

        if init_history:
            for e in init_history:
                self.history.append(e)
            self.last_idx = len(self.history)

    def up_down(self, event):
        if not self.last_idx is None:
            self.delete(0, tk.END)

            if event.keysym == 'Up':
                if self.last_idx > 0:
                    self.last_idx -= 1
                else:
                    self.last_idx = len(self.history) -1
            elif event.keysym == 'Down':
                if self.last_idx < len(self.history) -1:
                    self.last_idx += 1
                else:
                    self.last_idx = 0

            self.insert(0, self.history[self.last_idx])

    def add(self, event):
        self.history.append(self.get())
        self.last_idx = len(self.history) - 1

if __name__ == "__main__":
    root = tk.Tk()
    entry = EntryHistory(root, init_history=['test 1', 'test 2', 'test 3'])
    entry.grid(row=0, column=0)
    root.mainloop()
将tkinter作为tk导入
类入口历史记录(tk.Entry):
def uuu init uuu(self、parent、init_history=None):
super()。\uuuu init\uuuu(父级)
self.bind(“”,self.add)
自我约束(“”,自我上下)
自我约束(“”,自我上下)
self.history=[]
self.last_idx=无
如果初始化历史:
对于初始历史中的e:
self.history.append(e)
self.last_idx=len(self.history)
def up_down(自身、事件):
如果不是self.last_idx为None:
self.delete(0,tk.END)
如果event.keysym==“向上”:
如果self.last_idx>0:
self.last_idx-=1
其他:
self.last_idx=len(self.history)-1
elif event.keysym==“向下”:
如果self.last_idx
使用Python:3.5测试

问题:按绑定到
条目
小部件的
向上
/
向下
箭头键,循环列表中的元素

创建一个继承自
tk.Entry
类对象

import tkinter as tk

class EntryHistory(tk.Entry):
    def __init__(self, parent, init_history=None):
        super().__init__(parent)
        self.bind('<Return>', self.add)
        self.bind('<Up>', self.up_down)
        self.bind('<Down>', self.up_down)

        self.history = []
        self.last_idx = None

        if init_history:
            for e in init_history:
                self.history.append(e)
            self.last_idx = len(self.history)

    def up_down(self, event):
        if not self.last_idx is None:
            self.delete(0, tk.END)

            if event.keysym == 'Up':
                if self.last_idx > 0:
                    self.last_idx -= 1
                else:
                    self.last_idx = len(self.history) -1
            elif event.keysym == 'Down':
                if self.last_idx < len(self.history) -1:
                    self.last_idx += 1
                else:
                    self.last_idx = 0

            self.insert(0, self.history[self.last_idx])

    def add(self, event):
        self.history.append(self.get())
        self.last_idx = len(self.history) - 1

if __name__ == "__main__":
    root = tk.Tk()
    entry = EntryHistory(root, init_history=['test 1', 'test 2', 'test 3'])
    entry.grid(row=0, column=0)
    root.mainloop()
将tkinter作为tk导入
类入口历史记录(tk.Entry):
def uuu init uuu(self、parent、init_history=None):
super()。\uuuu init\uuuu(父级)
self.bind(“”,self.add)
自我约束(“”,自我上下)
自我约束(“”,自我上下)
self.history=[]
self.last_idx=无
如果初始化历史:
对于初始历史中的e:
self.history.append(e)
self.last_idx=len(self.history)
定义_