Python 如何在tkinter上的一个框架中具有多个带滚动条的文本小部件
我希望我的文本小部件在每个文本小部件中都具有Python 如何在tkinter上的一个框架中具有多个带滚动条的文本小部件,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我希望我的文本小部件在每个文本小部件中都具有滚动条功能。我已经创建了一个画布,并在其中嵌入了一个框架,使用创建窗口。然后我将两个文本小部件放入这个框架中。我希望每个文本小部件都有一个滚动条,但是当我添加滚动条时,其中一个适合整个框架,而另一个适合框架的一半。我该如何解决这个问题 import tkinter as tk import os import tkinter.filedialog import tkinter.messagebox class Main(tk.Tk): def __
滚动条
功能。我已经创建了一个画布
,并在其中嵌入了一个框架
,使用创建窗口
。然后我将两个文本小部件放入这个框架中。我希望每个文本小部件都有一个滚动条,但是当我添加滚动条时,其中一个适合整个框架,而另一个适合框架的一半。我该如何解决这个问题
import tkinter as tk
import os
import tkinter.filedialog
import tkinter.messagebox
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
'''This initialisation runs the whole program'''
#textBoxList = []
tk.Tk.__init__(self, *args, **kwargs)
self.title('Untitled')
self.geometry('500x500')
self.canvas = tk.Canvas(self)
self.scroll = tk.Scrollbar(self, orient='vertical', command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scroll.set)
self.frame = tk.Frame(self.canvas) # frame does not get pack() as it needs to be embedded into canvas throught canvas.
self.scroll.pack(side='right', fill='y')
self.canvas.pack(fill='both', expand='yes')
self.canvas.create_window((0,0), window=self.frame, anchor='nw')
self.frame.bind('<Configure>', self.canvas.configure(scrollregion=self.canvas.bbox('all')))
# 1st Text Widget
self.journal = tk.Text(self.frame)
self.vsb = tk.Scrollbar(self.frame)
self.vsb.config(command=self.journal.yview)
self.journal.config(yscrollcommand=self.vsb.set)
self.vsb.pack(side='right', fill='y')
self.journal.pack()
#2nd Text Widget
self.good = tk.Text(self.frame)
self.vsb2 = tk.Scrollbar(self.frame)
self.vsb2.config(command=self.good.yview)
self.good.config(yscrollcommand=self.vsb2.set)
self.vsb2.pack(side='right', fill='y')
self.good.pack()
root = Main()
root.mainloop()
将tkinter作为tk导入
导入操作系统
导入tkinter.filedialog
导入tkinter.messagebox
主类(tk.tk):
定义初始化(self,*args,**kwargs):
''此初始化运行整个程序''
#textBoxList=[]
tk.tk.\uuuuu初始化(self,*args,**kwargs)
self.title(“无标题”)
自几何体('500x500')
self.canvas=tk.canvas(self)
self.scroll=tk.Scrollbar(self,orient='vertical',command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scroll.set)
self.frame=tk.frame(self.canvas)#frame没有获得pack(),因为它需要通过画布嵌入到画布中。
self.scroll.pack(side='right',fill='y')
self.canvas.pack(fill='both',expand='yes')
self.canvas.create_window((0,0),window=self.frame,anchor='nw')
self.frame.bind(“”,self.canvas.configure(scrollregion=self.canvas.bbox('all'))
#第一个文本小部件
self.journal=tk.Text(self.frame)
self.vsb=tk.Scrollbar(self.frame)
self.vsb.config(命令=self.journal.yview)
self.journal.config(yscrollcommand=self.vsb.set)
self.vsb.pack(side='right',fill='y')
self.journal.pack()
#第二个文本小部件
self.good=tk.Text(self.frame)
self.vsb2=tk.Scrollbar(self.frame)
self.vsb2.config(命令=self.good.yview)
self.good.config(yscrollcommand=self.vsb2.set)
self.vsb2.pack(side='right',fill='y')
self.good.pack()
root=Main()
root.mainloop()
我不知道为什么会发生这种情况,但您可以通过为每个文本/滚动条对创建一个框架来解决这个问题
first_text_frame = tk.Frame(self.frame)
first_text_frame.pack()
# 1st Text Widget
self.journal = tk.Text(first_text_frame)
self.vsb = tk.Scrollbar(first_text_frame)
self.vsb.config(command=self.journal.yview)
self.journal.config(yscrollcommand=self.vsb.set)
self.vsb.pack(side='right', fill='y')
self.journal.pack()
second_text_frame = tk.Frame(self.frame)
second_text_frame.pack()
#2nd Text Widget
self.good = tk.Text(second_text_frame)
self.vsb2 = tk.Scrollbar(second_text_frame)
self.vsb2.config(command=self.good.yview)
self.good.config(yscrollcommand=self.vsb2.set)
self.vsb2.pack(side='right', fill='y')
self.good.pack()
如果希望有两个文本小部件,一个在另一个之上,每个小部件的右侧都有一个滚动条,
pack
是几何体管理器的错误选择。您应该切换到网格
,或者使用一些内部框架使其适合
您的另一个选择是创建一个自定义类,该类是一个包含一个文本小部件和一个滚动条的框架。然后,创建该类的两个实例,并将一个实例放在另一个实例上。两个问题(除了粘贴代码时可能出现的混乱缩进):
帧
绑定到函数的返回值,而不是函数本身。您可以使用lambda
函数解决此问题pack()
创建复杂布局。请尝试grid()
将tkinter作为tk导入
导入操作系统
导入tkinter.filedialog
导入tkinter.messagebox
主类(tk.tk):
定义初始化(self,*args,**kwargs):
''此初始化运行整个程序''
#textBoxList=[]
tk.tk.\uuuuu初始化(self,*args,**kwargs)
self.title(“无标题”)
自几何体('500x500')
self.canvas=tk.canvas(self)
self.scroll=tk.Scrollbar(self,orient='vertical',command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scroll.set)
self.frame=tk.frame(self.canvas)#frame没有获得pack(),因为它需要通过画布嵌入到画布中。
self.scroll.pack(side='right',fill='y')
self.canvas.pack(fill='both',expand='yes')
self.canvas.create_window((0,0),window=self.frame,anchor='nw')
self.frame.bind(“”,lambda x:self.canvas.configure(scrollregion=self.canvas.bbox('all'))#lambda函数
#第一个文本小部件
self.journal=tk.Text(self.frame)
self.vsb=tk.Scrollbar(self.frame)
self.vsb.config(命令=self.journal.yview)
self.journal.config(yscrollcommand=self.vsb.set)
self.journal.grid(行=0,列=0)#改为grid
self.vsb.grid(行=0,列=1,sticky='ns')#grid
#第二个文本小部件
self.good=tk.Text(self.frame)
self.vsb2=tk.Scrollbar(self.frame)
self.vsb2.config(命令=self.good.yview)
self.good.config(yscrollcommand=self.vsb2.set)
self.good.grid(行=1,列=0)#改为grid
self.vsb2.grid(行=1,列=1,sticky='ns')#grid
root=Main()
root.mainloop()
如果没有答案很难回答。很抱歉,我编辑了代码,使之成为MCVEThanks,您是否可以扩展问题1,因为我不太理解:a)帧如何绑定到返回值b)提供lambda如何使其绑定到函数而不是函数请参阅了解更多信息。基本上,multiply(2,3)
不是一个函数,它只是数字6
。lambda
关键字定义函数,基本上用作包装器。
import tkinter as tk
import os
import tkinter.filedialog
import tkinter.messagebox
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
'''This initialisation runs the whole program'''
#textBoxList = []
tk.Tk.__init__(self, *args, **kwargs)
self.title('Untitled')
self.geometry('500x500')
self.canvas = tk.Canvas(self)
self.scroll = tk.Scrollbar(self, orient='vertical', command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scroll.set)
self.frame = tk.Frame(self.canvas) # frame does not get pack() as it needs to be embedded into canvas throught canvas.
self.scroll.pack(side='right', fill='y')
self.canvas.pack(fill='both', expand='yes')
self.canvas.create_window((0,0), window=self.frame, anchor='nw')
self.frame.bind('<Configure>', lambda x: self.canvas.configure(scrollregion=self.canvas.bbox('all'))) # lambda function
# 1st Text Widget
self.journal = tk.Text(self.frame)
self.vsb = tk.Scrollbar(self.frame)
self.vsb.config(command=self.journal.yview)
self.journal.config(yscrollcommand=self.vsb.set)
self.journal.grid(row=0, column=0) # grid instead
self.vsb.grid(row=0, column=1, sticky='ns') # grid instead
#2nd Text Widget
self.good = tk.Text(self.frame)
self.vsb2 = tk.Scrollbar(self.frame)
self.vsb2.config(command=self.good.yview)
self.good.config(yscrollcommand=self.vsb2.set)
self.good.grid(row=1, column=0) # grid instead
self.vsb2.grid(row=1, column=1, sticky='ns') # grid instead
root = Main()
root.mainloop()