使用Tkinter(Python)在框架上嵌入带有图像和滚动条的按钮

使用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

我正在尝试在Tkinter窗口中创建一个on button click事件。我有一个Tkinter窗口,上面有按钮。按下其中一个按钮,使用Toplevel打开一个新的Tkinter窗口。这个窗口有一个滚动条和一些其他按钮,上面有可以垂直向下滚动的图像。我可以分别创建这两个功能,也就是说,我可以在Tkinter窗口中嵌入一个带有图像的按钮,并使用滚动条,但无法在以前的Tkinter窗口中调用相同的功能

我使用的代码是-

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()