GVKun编程网logo

在Tkinter中将滚动条添加到一组小部件中(tkinter 滚动条)

29

关于在Tkinter中将滚动条添加到一组小部件中和tkinter滚动条的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于html–将滚动条添加到表格、php–将滚动条添加到html、Pyth

关于在Tkinter中将滚动条添加到一组小部件中tkinter 滚动条的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于html – 将滚动条添加到表格、php – 将滚动条添加到html、Python Tkinter:将滚动条附加到列表框而不是窗口、python – 在Tkinter中滚动一组小部件等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

在Tkinter中将滚动条添加到一组小部件中(tkinter 滚动条)

在Tkinter中将滚动条添加到一组小部件中(tkinter 滚动条)

我正在使用Python解析日志文件中的条目,并使用Tkinter显示条目内容,到目前为止,它非常出色。输出是一个标签小部件的网格,但有时行数多于屏幕上可以显示的数。我想添加一个滚动条,它看起来应该很简单,但是我无法弄清楚。

该文档暗示只有“列表”,“文本框”,“画布”和“条目”小部件支持滚动条界面。这些似乎都不适合显示小部件的网格。可以在Canvas小部件中放置任意小部件,但是您似乎必须使用绝对坐标,因此我将无法使用网格布局管理器?

我尝试将小部件网格放入框架中,但这似乎不支持滚动条界面,因此这行不通:

mainframe = Frame(root, yscrollcommand=scrollbar.set)

谁能提出解决此限制的方法?我讨厌不得不在PyQt中重写并增加可执行映像的大小,以增加滚动条!

答案1

小编典典

总览
您只能将滚动条与一些小部件关联,而根小部件Frame则不属于该组小部件。

最常见的解决方案是创建一个画布小部件,并将滚动条与该小部件相关联。然后,将包含标签小部件的框架嵌入该画布。确定框架的宽度/高度,并将其输入到canvasscrollregion选项中,以使滚动区域与框架的尺寸完全匹配。

为什么将小部件放在框架中而不是直接放在画布中?附加到画布的滚动条只能滚动使用其中一种create_方法创建的项目。您不能滚动添加到画布的项目pack,place或grid。通过使用框架,可以在框架内部使用这些方法,然后create_window为该框架调用一次。

直接在画布上绘制文本项不是很困难,因此,如果将帧嵌入画布的解决方案看起来过于复杂,则可能需要重新考虑这种方法。由于创建的是网格,因此每个文本项的坐标将非常易于计算,尤其是当每一行的高度相同时(如果使用的是单个字体,则可能是这样)。

要直接在画布上绘图,只需弄清楚所使用字体的行高(并有相应的命令)。然后,每个y坐标为row*(lineheight+spacing)。x坐标将是固定的数字,基于每列中最宽的项目。如果为所有内容都为其所在的列提供标签,则可以使用单个命令调整列中所有项目的x坐标和宽度。

面向对象的解决方案
这是使用面向对象方法的画布嵌入式框架解决方案的示例:

import tkinter as tkclass Example(tk.Frame):    def __init__(self, parent):        tk.Frame.__init__(self, parent)        self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")        self.frame = tk.Frame(self.canvas, background="#ffffff")        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)        self.canvas.configure(yscrollcommand=self.vsb.set)        self.vsb.pack(side="right", fill="y")        self.canvas.pack(side="left", fill="both", expand=True)        self.canvas.create_window((4,4), window=self.frame, anchor="nw",                                  tags="self.frame")        self.frame.bind("<Configure>", self.onFrameConfigure)        self.populate()    def populate(self):        ''''''Put in some fake data''''''        for row in range(100):            tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1",                     relief="solid").grid(row=row, column=0)            t="this is the second column for row %s" %row            tk.Label(self.frame, text=t).grid(row=row, column=1)    def onFrameConfigure(self, event):        ''''''Reset the scroll region to encompass the inner frame''''''        self.canvas.configure(scrollregion=self.canvas.bbox("all"))if __name__ == "__main__":    root=tk.Tk()    example = Example(root)    example.pack(side="top", fill="both", expand=True)    root.mainloop()

程序解决方案
这是不使用类的解决方案:

import tkinter as tkdef populate(frame):    ''''''Put in some fake data''''''    for row in range(100):        tk.Label(frame, text="%s" % row, width=3, borderwidth="1",                  relief="solid").grid(row=row, column=0)        t="this is the second column for row %s" %row        tk.Label(frame, text=t).grid(row=row, column=1)def onFrameConfigure(canvas):    ''''''Reset the scroll region to encompass the inner frame''''''    canvas.configure(scrollregion=canvas.bbox("all"))root = tk.Tk()canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")frame = tk.Frame(canvas, background="#ffffff")vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)canvas.configure(yscrollcommand=vsb.set)vsb.pack(side="right", fill="y")canvas.pack(side="left", fill="both", expand=True)canvas.create_window((4,4), window=frame, anchor="nw")frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))populate(frame)root.mainloop()

html – 将滚动条添加到表格

html – 将滚动条添加到表格

我想在固定标题的表格中添加一个垂直和水平滚动条.通过使用thead和tbody标签我可以在firefox中添加滚动条,但IE不支持在tbody中的overflow:auto属性. IE8不支持css表达式所以你能告诉我如何实现这个目标吗?

解决方法

使用CSS应该很容易
div.scrollWrapper{

  height:250px;
  width:200px;
  overflow:scroll;
}


<div>
<table >
<tbody height="xxx">
<tr>......

</tbody>
</table>
</div>

php – 将滚动条添加到html

php – 将滚动条添加到html

我有一个弹出窗口,其中包含以下源代码(“likes.PHP”):

<!DOCTYPE html>
<html>
<head>
    <title>Like</title>
  <Meta content="text/html;charset=utf-8" http-equiv="Content-Type">
</head>
<body>
<ol>
    <?PHP for($i=0;$i<500;$i++){ ?>
    <li><p><?PHP echo $i ?></p></li>
    <?PHP } ?>
</ol>
</body>
</html>

现在问题是虽然创建了所有段落,但我看不到它们,因为没有滚动条.如何将滚动条附加到我的页面?

Link to printscreen

它正在使用chrome,但不在firefox中,如果它出现在一个弹出窗口中(其他文件调用window.open(“likes.PHP”).在常规窗口的两个浏览器中都有效.

解决方法

使用css overflow属性.将此添加到您的< head>标签:

<style type="text/css">
  body,html {
    margin: 0;
    padding: 0;
    height: 100%;
  } 
  .scroller {
    overflow: scroll;
    padding: 5px;
    height: 100%;
  }
</style>

要专门添加水平或垂直滚动​​条,请分别使用overflow-x或overflow-y.

您还需要修复< li>的关闭标记.元素,并将其包装在适当的容器中,就像这样

<div>
  <ul>
    <?PHP for($i=0;$i<500;$i++)
              echo "<li>".$i."</li>";
    ?>
  </ul>
</div>

Python Tkinter:将滚动条附加到列表框而不是窗口

Python Tkinter:将滚动条附加到列表框而不是窗口

这是我当前窗口的屏幕截图:

屏幕截图

我的问题是,我根本无法使滚动条显示在列表框的右侧而不是主窗口的右侧。代码在这里:

from Tkinter import *def onselect(event):    w = event.widget    index = int(w.curselection()[0])    value = w.get(index)    info = find_info(value)    listSelection.delete(0, END)    listSelection.insert(END, "Node ID: " + info[0])    listSelection.insert(END, "Owner/Description: " + info[1])    listSelection.insert(END, "Last Latitude: " + info[2])    listSelection.insert(END, "Last Longitude: " + info[3])mapNodes = "http://ukhas.net/api/mapNodes"nodeData = "http://ukhas.net/api/nodeData"current_id = 0window = Tk() # create windowwindow.configure(bg=''lightgrey'')window.title("UKHASnet Node Manager")window.geometry("680x400")lbl1 = Label(window, text="Node List:", fg=''black'', font=("Helvetica", 16, "bold"))lbl2 = Label(window, text="Node Information:", fg=''black'', font=("Helvetica", 16,"bold"))lbl1.place(x=0, y=0)lbl2.place(x=200, y=0)scrollbar = Scrollbar(window, orient="vertical")listNodes = Listbox(window, width=20, height=20, yscrollcommand=scrollbar.set, font=("Helvetica", 12))scrollbar.config(command=listNodes.yview)scrollbar.pack(side="right", fill="y")listSelection = Listbox(window, width=50, height=4, font=("Helvetica", 12))# pack objects onto windowlistNodes.place(x=1, y=40)listSelection.place(x=200, y=40)

感谢所有帮助,我正在运行Ubuntu 14.04和Python 2.7.5

马特

答案1

小编典典

您已将滚动条附加到 window

Scrollbar(window, orient="vertical")

尝试附加到 listNodes

Scrollbar(listNodes, orient="vertical")

Frame使用Listbox滚动条创建并附加到该框架。


编辑: 示例Frame

from Tkinter import *window = Tk()window.geometry("680x500")Label(window, text="Top label").pack()frame = Frame(window)frame.pack()listNodes = Listbox(frame, width=20, height=20, font=("Helvetica", 12))listNodes.pack(side="left", fill="y")scrollbar = Scrollbar(frame, orient="vertical")scrollbar.config(command=listNodes.yview)scrollbar.pack(side="right", fill="y")listNodes.config(yscrollcommand=scrollbar.set)for x in range(100):    listNodes.insert(END, str(x))Label(window, text="Bottom label").pack()window.mainloop()

在此处输入图片说明


编辑: 在您的代码框架-我使用,grid/pack因为我更喜欢它。

我添加了一些代码,因此现在在调整窗口大小时列出了调整大小。

from Tkinter import *def onselect(event):    w = event.widget    index = int(w.curselection()[0])    value = w.get(index)    info = find_info(value)    listSelection.delete(0, END)    listSelection.insert(END, "Node ID: " + info[0])    listSelection.insert(END, "Owner/Description: " + info[1])    listSelection.insert(END, "Last Latitude: " + info[2])    listSelection.insert(END, "Last Longitude: " + info[3])mapNodes = "http://ukhas.net/api/mapNodes"nodeData = "http://ukhas.net/api/nodeData"current_id = 0window = Tk() # create windowwindow.configure(bg=''lightgrey'')window.title("UKHASnet Node Manager")window.geometry("680x400")lbl1 = Label(window, text="Node List:", fg=''black'', font=("Helvetica", 16, "bold"))lbl2 = Label(window, text="Node Information:", fg=''black'', font=("Helvetica", 16,"bold"))lbl1.grid(row=0, column=0, sticky=W)lbl2.grid(row=0, column=1, sticky=W)frm = Frame(window)frm.grid(row=1, column=0, sticky=N+S)window.rowconfigure(1, weight=1)window.columnconfigure(1, weight=1)scrollbar = Scrollbar(frm, orient="vertical")scrollbar.pack(side=RIGHT, fill=Y)listNodes = Listbox(frm, width=20, yscrollcommand=scrollbar.set, font=("Helvetica", 12))listNodes.pack(expand=True, fill=Y)scrollbar.config(command=listNodes.yview)listSelection = Listbox(window, height=4, font=("Helvetica", 12))listSelection.grid(row=1, column=1, sticky=E+W+N)for x in range(100):    listNodes.insert(END, x)for x in "ABCD":listSelection.insert(END, x + ": ?")

在此处输入图片说明

python – 在Tkinter中滚动一组小部件

python – 在Tkinter中滚动一组小部件

我想在Tkinter GUI中创建可以滚动的各个小部件的整列,如下所示:

Tkinter can only attach scrollbars to certain widgets,其中不包括框架.制作可分割列是接口中的常见做法,应该有一个简单的解决方案,但到目前为止,我所能找到的只是this hacky example of a scrollable frame,using a canvas widget.在similar stack overflow question中使用了类似的hacky解决方案.

在Tkinter中是否有一种普遍接受的方法可以创建一个可滚动的列或一组小部件?

解决方法

使用画布的解决方案是解决此问题的常用方法.它真的不是那么hacky,最终结果可以与原生滚动容器小部件无法区分.

如果您要创建单个列,则另一个选项是使用文本窗口小部件,并使用窗口小部件嵌入其他窗口小部件的功能.插入小部件,然后插入换行符,插入另一个小部件等.然后您可以免费获得滚动功能.您唯一需要担心的是配置嵌入式窗口的宽度,这并不难.

今天的关于在Tkinter中将滚动条添加到一组小部件中tkinter 滚动条的分享已经结束,谢谢您的关注,如果想了解更多关于html – 将滚动条添加到表格、php – 将滚动条添加到html、Python Tkinter:将滚动条附加到列表框而不是窗口、python – 在Tkinter中滚动一组小部件的相关知识,请在本站进行查询。

本文标签: