将填充查询插入添加到列表框

时间:2019-03-20 18:26:16

标签: python-3.x tkinter

我已经阅读了许多线程和其他资源,试图找到正确的方法来处理此问题,但是我没有找到适合我的应用程序的任何内容。 这是我要完成的工作。

查询完成并且将数据插入到列表框后,我似乎无法用1个字符的空间将数据插入到空白位置。

我正在使用pack(),并且已经阅读了tkinter手册,并尝试了每个可用示例以及在各个线程上找到的其他示例。

小部件:

output = tkinter.Listbox(window_2, height = 20, font='Times 10',
width=42, bd=1, bg = '#FFD599', fg = '#9A0615', selectmode=SINGLE)

output.pack()
output.place(x=210, y=195)

我尝试用pack()进行padx和pady的操作都没有成功,尽管它可以与Text小部件一起使用。我还尝试使用了一些我在网站上找到的替代方法,但是在插入数据时,所有这些方法都没有成功地使列表框成为空白。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

pack的{​​{1}}和padx/pady选项不会影响列表框中的数据。列表框本身没有任何添加内部边距的选项。

要在列表框的内部留出一定的空白,我通常要做的是将其ipadx/ipadyborderwidth设为零,然后将其放置在具有相同背景色的框架中,边框是边界。然后,您可以在边框和列表框之间添加所需的任何填充。

这也很方便,因为您可以在框架内放置一个滚动条,使它看起来像是在列表框内,而实际上不在列表框内。

示例:

highlightthickness

enter image description here

答案 1 :(得分:0)

首先要在tkinter列表框中格式化字符,您需要使用固定字体和.format python函数。...;

因此您可以执行此操作

按“加载”以将数据加载到列表框中,并注意该行代码

s ='{0:> 8} {1:5}'。format(i [0],i [1])

self.list.insert(tk.END,s)

import tkinter as tk

RS = (('Apple',10),
      ('Banana',20),
      ('Peack',8),
      ('Lemon',6),)

class App(tk.Frame):

    def __init__(self,):

        super().__init__()

        self.master.title("Hello World")
        self.init_ui()

    def init_ui(self):

        self.pack(fill=tk.BOTH, expand=1,)

        f = tk.Frame()

        sb = tk.Scrollbar(f,orient=tk.VERTICAL)

        self.list = tk.Listbox(f,
                    relief=tk.GROOVE,
                    selectmode=tk.BROWSE,
                    exportselection=0,
                    background = 'white',
                    font='TkFixedFont',
                    yscrollcommand=sb.set,)

        sb.config(command=self.list.yview)

        self.list.pack(side=tk.LEFT,fill=tk.BOTH, expand =1) 
        sb.pack(fill=tk.Y, expand=1)

        w = tk.Frame()

        tk.Button(w, text="Load", command=self.on_callback).pack()
        tk.Button(w, text="Close", command=self.on_close).pack()

        f.pack(side=tk.LEFT, fill=tk.BOTH, expand=0)
        w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=0)


    def on_callback(self,):

        for i in RS:
            s = '{0:>8}{1:5}'.format(i[0],i[1])
            self.list.insert(tk.END, s)


    def on_close(self):
        self.master.destroy()

if __name__ == '__main__':
    app = App()
    app.mainloop()

答案 2 :(得分:0)

这是布莱恩·奥克利(Bryan Oakley)广受赞赏的答案的一种变化。

  • 它使用ttk小部件而不是tk小部件
  • 使用鼠标滚动时,滚动条会跟踪您在列表框中的位置
  • 使用oStyle.theme_use(“ clam”),因为它看起来更现代...可以注释掉

'

import tkinter as tk
from tkinter import ttk

try:  # allows the text to be more crisp on a high dpi display
  from ctypes import windll
  windll.shcore.SetProcessDpiAwareness(1)
except:
  pass

root = tk.Tk()
oStyle = ttk.Style()
oStyle.theme_use("clam")
oStyle.configure('LB.TFrame', bd=1, relief="sunken", background="white")
listbox_border = ttk.Frame(root, style='LB.TFrame')
listbox_border.pack(padx=4, pady=4, fill=None, expand=False)
vsb = ttk.Scrollbar(listbox_border)
vsb.pack(side="right", fill="y")
listbox = tk.Listbox(listbox_border, width=20, height=10, borderwidth=0,
                     highlightthickness=0, selectmode=tk.SINGLE,
                     activestyle=tk.NONE)
listbox.pack(padx=6, pady=6, fill="y", expand=True)
listbox.config(yscrollcommand=vsb.set)
vsb.config(command=listbox.yview)
for i in range(100):
    listbox.insert("end", "Item #{}".format(i))

root.mainloop()

' enter image description here