【问题标题】:Why are my options for Frames not showing in tkinter?为什么我的 Frames 选项没有在 tkinter 中显示?
【发布时间】:2021-05-15 05:15:49
【问题描述】:

这是我正在制作的 UI 设计的代码:

from tkinter import *
import random
import time
import sqlite3
from tkinter import simpledialog
from tkinter import messagebox
from tkcalendar import *
from tkinter import ttk
import math
from PIL import Image, ImageTk
import winsound

##-------------Frames setup--------------------------
class VendingApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        self._frame = None
        self.switch_frame(Store)

    def switch_frame(self, frame_class):
        #Destroys current frame and replaces it with a new one.
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

class Store(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)

        self._images = list()

        img_banner = Image.open("pic/banner.jpg")
        img_banner = img_banner.resize((400, 100), Image.ANTIALIAS)
        banner = ImageTk.PhotoImage(img_banner)

        img_logo = Image.open("pic/sitelogo.png")
        img_logo = img_logo.resize((100, 100), Image.ANTIALIAS)
        logo = ImageTk.PhotoImage(img_logo)

        self._images.append(logo)
        self._images.append(banner)

        ##---------------------Top frame Home------------------------------------
        topFrame = Frame(self, width=500, height=100)
        topFrame.grid(row = 0, column = 0, columnspan = 2)
        topFrame.grid_propagate(False)

        canvas_for_logo = Canvas(topFrame, height=100, width=100, bg='green')  ##logo image
        canvas_for_logo.grid(row=0, column=0, sticky='nesw')
        canvas_for_logo.grid_propagate(False)

        canvas_for_logo.create_image(0, 0, anchor=NW, image=logo)

        canvas_for_banner = Canvas(topFrame, height=100, width=400 ) # banner image
        canvas_for_banner.grid(row=0, column=1, sticky='nesw')
        canvas_for_banner.grid_propagate(False)

        canvas_for_banner.create_image(0, 0, anchor=NW, image=banner)
 ##---------------------------------Midd-------------------

        LeftSide = Frame(self,width = 150, height = 450, relief = RAISED, bg = 'grey')
        LeftSide.grid(row = 1, column = 0)

        RightSide = Frame(self,width = 350, height = 450, bg = 'red')
        RightSide.grid(row = 1, column = 1)

        BottomFrame = Frame(self,width = 500, height = 50, bg = 'black')
        BottomFrame.grid(row = 2, column =0, columnspan = 2)

        test_btn = Button(BottomFrame, command = None, bg = 'green', width = 5, height = 5)
        test_btn.pack()



#----------------------------------------------------------------------------------------
if __name__ == "__main__":
    root = VendingApp()
    #Renames the TITLE of the window
    root.title("Vending machine")
    root.geometry("500x600")
    root.resizable(False, False)
    root.mainloop()

我有几个问题:

  1. 为什么左侧框架上的 RAISE 浮雕没有显示? (编辑:这个问题已经回答)

  2. 为什么左右帧的bg变了,而底下的bg没有变化? (编辑:这个问题已经回答)

  3. 如果你用任何图片替换logo和banner,我相信你会看到两个logo上都有一个空白空间,一个在logo和应用程序的边缘之间,一个在logo之间和横幅。为什么会这样? (编辑:我做了更多的研究,终于找到了解决方案)

非常感谢每一个回复。

【问题讨论】:

    标签: python user-interface tkinter tkinter-canvas


    【解决方案1】:

    使用 grid_propagate(0) 和 test_btn.grid()

        BottomFrame.grid(row=2, column=0, columnspan=2)
        BottomFrame.grid_propagate(0)
    
        test_btn = Button(BottomFrame, command=None, bg='green', width=5, height=5)
        test_btn.grid()
    

    【讨论】:

    • 是的,可以。我在课堂上问过我的老师,他说因为我使用 pack() 作为按钮,但传播选项是用于 grid(),因此为什么它对按钮没有任何影响。显然, grid/pack_propagate 只影响对象中/对象上的东西,而不影响对象本身。无论如何感谢您的回复,非常感谢。
    • 正如我已经说过的:最好在程序中只使用一个几何图形,这样更容易修复或更改。
    【解决方案2】:
    1. 您必须添加bd=5(边框大小)
    2. 首先不要混合pack()grid()。其次,当您将 btn 添加到底部框架时,框架采用按钮的大小。您必须使用 BottomFrame.propagate(0) 忽略按钮大小。

    【讨论】:

    • 在这个程序中混合使用packgrid 非常好,因为它们被用于不同的小部件。
    • @hussic 感谢您的回复。边框尺寸建议效果很好。但是,当我将底部框架的传播属性更改为 false 时,按钮仍然会继续调整框架大小,知道为什么吗?
    猜你喜欢
    • 2019-04-28
    • 2018-09-08
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多