使用Tkinter(Python)在框架上嵌入带有图像和滚动条的按钮
我正在尝试在Tkinter窗口中创建一个on button click事件。我有一个Tkinter窗口,上面有按钮。按下其中一个按钮,使用Toplevel打开一个新的Tkinter窗口。这个窗口有一个滚动条和一些其他按钮,上面有可以垂直向下滚动的图像。我可以分别创建这两个功能,也就是说,我可以在Tkinter窗口中嵌入一个带有图像的按钮,并使用滚动条,但无法在以前的Tkinter窗口中调用相同的功能 我使用的代码是-使用Tkinter(Python)在框架上嵌入带有图像和滚动条的按钮,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,我正在尝试在Tkinter窗口中创建一个on button click事件。我有一个Tkinter窗口,上面有按钮。按下其中一个按钮,使用Toplevel打开一个新的Tkinter窗口。这个窗口有一个滚动条和一些其他按钮,上面有可以垂直向下滚动的图像。我可以分别创建这两个功能,也就是说,我可以在Tkinter窗口中嵌入一个带有图像的按钮,并使用滚动条,但无法在以前的Tkinter窗口中调用相同的功能 我使用的代码是- from Tkinter import * from ttk import
from Tkinter import *
from ttk import *
class VerticalScrolledFrame(Frame):
def __init__(self, parent, *args, **kw):
Frame.__init__(self, parent, *args, **kw)
# create a canvas object and a vertical scrollbar for scrolling it
vscrollbar = Scrollbar(self, orient=VERTICAL)
vscrollbar.pack(fill=Y, side=RIGHT, expand=FALSE)
canvas = Canvas(self, bd=0, highlightthickness=0,
yscrollcommand=vscrollbar.set)
canvas.pack(side=LEFT, fill=BOTH, expand=TRUE)
vscrollbar.config(command=canvas.yview)
# reset the view
canvas.xview_moveto(0)
canvas.yview_moveto(0)
# create a frame inside the canvas which will be scrolled with it
self.interior = interior = Frame(canvas)
interior_id = canvas.create_window(0, 0, window=interior,
anchor=NW)
def _configure_interior(event):
# update the scrollbars to match the size of the inner frame
size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
canvas.config(scrollregion="0 0 %s %s" % size)
if interior.winfo_reqwidth() != canvas.winfo_width():
# update the canvas's width to fit the inner frame
canvas.config(width=interior.winfo_reqwidth())
interior.bind('<Configure>', _configure_interior)
def _configure_canvas(event):
if interior.winfo_reqwidth() != canvas.winfo_width():
# update the inner frame's width to fill the canvas
canvas.itemconfigure(interior_id, width=canvas.winfo_width())
canvas.bind('<Configure>', _configure_canvas)
#if __name__ == "__main__":
class SampleApp(Tk):
def __init__(self, *args, **kwargs):
#from Tkinter import *
print "in constructor"
import Tkinter
import ImageTk
import Image
import cv2
import numpy as np
import cv2.cv as cv
import math
import tkFileDialog
import tkMessageBox
import Tkinter as tk
root = Tk.__init__(self, *args, **kwargs)
def Print():
print "print function"
self.frame = VerticalScrolledFrame(root)
self.frame.pack()
self.label = Label(text="Shrink the window to activate the scrollbar.")
self.label.pack()
compare_button_path = "compare-button.jpg"
image_compare = Image.open(compare_button_path)
image_compare.thumbnail((70,45))
photo_compare = ImageTk.PhotoImage(image_compare)
button = tk.Button(self.frame, width=120, height=40, image=photo_compare,fg='black',bg='medium turquoise', activebackground='indian red',cursor="hand2",bd=6,relief=RAISED, compound=tk.LEFT, text="Compare",command = Print)
button.image = photo_compare
button.pack(side=LEFT)
buttons = []
for i in range(10):
buttons.append(Button(self.frame.interior, text="Button " + str(i)))
buttons[-1].pack()
app = SampleApp()
app.mainloop()
如果我试图将函数保存在其他文件中,并将其导入到原始Tk文件中,并在单击按钮时创建该类的对象,则在编译原始Tk文件期间会自动调用第二个文件。
谁能建议一条出路吗 我真的不明白你的问题,即使在要求澄清之后。您最后在问题的评论中写道:“我只想打开一个包含按钮和图像的tkinter窗口,从另一个tkinter窗口单击按钮即可” 我不明白是什么阻止你这么做。我认为你的代码唯一的错误就是你没有创建一个
Toplevel
的实例(除了一组混乱的导入)。除此之外,您的代码应该可以工作
例如,如果您将示例应用修改为如下所示,则可以打开任意多个窗口:
class SampleApp(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
b = Button(self, text="Open a new window", command=self.open_new)
b.pack()
def open_new(self):
top = Toplevel()
self.frame = VerticalScrolledFrame(top)
self.frame.pack()
def Print():
print "print function"
button = Button(self.frame, text="Compare",command = Print)
button.pack(side=LEFT)
buttons = []
for i in range(10):
buttons.append(Button(self.frame.interior, text="Button " + str(i)))
buttons[-1].pack()
你写道“我可以嵌入一个带有图像的按钮……但不能将其与以前的Tkinter窗口集成。”你说“不能”是什么意思?是什么阻止你这么做的?你写了“这个函数给出了一个很好的结果”,哪个函数?你发布的代码有不止一个功能。我的意思是,我无法创建一个带有滚动条的窗口,滚动条上会嵌入所有带有图像的按钮。你为什么不能?是什么阻止你这么做的?你有错误吗?程序崩溃了吗?它不起作用了吗?按钮是否出现在错误的窗口上?按钮显示有图像,但滚动条不起作用,即,我希望如果缩小窗口,我可以向下滚动查看我发布的代码中出现的不同按钮,但当我添加图像,然后缩小窗口时,窗口变得不可滚动。我仍然不明白你在问什么。您声称另一个窗口中的滚动条有问题,但代码仅显示一个窗口,您询问如何在单击按钮时调用函数,您显示了一个看起来完全无关的翻转错误。这很令人困惑。
class SampleApp(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
b = Button(self, text="Open a new window", command=self.open_new)
b.pack()
def open_new(self):
top = Toplevel()
self.frame = VerticalScrolledFrame(top)
self.frame.pack()
def Print():
print "print function"
button = Button(self.frame, text="Compare",command = Print)
button.pack(side=LEFT)
buttons = []
for i in range(10):
buttons.append(Button(self.frame.interior, text="Button " + str(i)))
buttons[-1].pack()