使用长列表数据向Tkinter添加滚动条

时间:2015-08-17 16:45:14

标签: python tkinter dialog window scrollbar

我目前在Tinker中的输出有问题。因此,每当我尝试输出从文件中读取的数据时,输出对话框太小,无法容纳庞大的数据列表。例如:

screenshot with no scrollbars

窗口太大而无法显示我的所有数据,因此我尝试为窗口添加滚动条,以便更好地适应数据并轻松查看所有数据。

问题出现在我的代码中:

from Tkinter import *
import tkSimpleDialog
import tkMessageBox

root = Tk()
w = Label(root, text ="my Program")
w.pack()

tkMessageBox.showinfo("Welcome", "Add your welcome message here")

with open("Logs.txt", "rb") as f_input:
    start_token = tkSimpleDialog.askstring("Serial Number", "What is the device serial number?")
    end_token = tkSimpleDialog.askstring("End Keyword", "What is the end keyword")
    reText = re.search("%s(.*?)%s" % (re.escape(start_token + ",SHOWALL"), re.escape(end_token)), f_input.read(), re.S)
    if reText:
        output = reText.group(1)
        scrollbar = Scrollbar(root)
        scrollbar.pack( side = RIGHT, fill=Y, expand = False)

        mylist = Listbox(root, yscrollcommand = scrollbar.set )
        mylist.insert(END, output)

        mylist.pack( side = LEFT, fill = Y, expand = False)
        scrollbar.config( command = mylist.yview )
        mainloop()
        # tkMessageBox.showinfo("Output", output)
        print output
    else:
        print "not found"

当我添加滚动条时,我将其作为输出:

Scrollbar Error

所以我要做的是将数据放在一个带有滚动条的漂亮窗口对话框中。

这是输出:

APN=""
APU=""
APP=""
DDC=
FMT=""
HDR=
AKR=
AKT=
AKP=
PMR=
PKA=
PHN=""
PHS=""
HBI=
PMF=
PMN=
PRN=
PRF=
RET=
SFR=
SFT=
SXD=
SXV=
SXW=
SXX=
SPM=
VIT=
VID=
VPT=
ATN=
ATF=
AMT=
AMD=
LGF=
GPA=
GFN=
GFO=
GDN=
GDF=
GPN=
SCN=
SCO=
SCP=
AEE=
AET=
AES=
OUA=
BWP=
MSO=
UPE=
UPC=
UPT=
VAA=
VAR=
VAI=
IVJ=
IGM=
IGA
IGB=
IGC=
IGD=
IGE=
IGF=
VOW=
VWD=

1 个答案:

答案 0 :(得分:2)

我认为您需要更改output插入Listbox的方式,假设其内容为换行符(如更新后的问题所示)。

documentationinsert()方法的调用顺序显示为:

插入(索引,*元素)

所以一种方法就是多次调用它,每个元素调用一次,循环:

for element in output.splitlines():
    mylist.insert(END, element)

但是,文档中第二个参数的*前缀意味着该方法接受从该点开始的变量个参数(每个参数将被放在一个单独的位置)线)。

这意味着可以在一次通话中完成同样的事情:

mylist.insert(END, *output.splitlines())

这样做首先将output数据分成基于其中新行的列表,然后通过前缀在方法调用中将它们作为一组单独的参数传递结果从output.splitlines()返回*,这会导致它被“解包”为多个调用参数。

这是一个相当常见的Python习语,因此值得学习和记忆。请参阅文档中的Unpacking Argument Lists