为什么我的框架选项没有显示在 tkinter 中?
Why are my options for Frames not showing in tkinter?
这是我正在制作的 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()
我有几个问题:
为什么左边框上的RAISE浮雕不显示? (编辑:此问题已回答)
为什么左右边框的bg变了,而下面的没有? (编辑:此问题已回答)
如果你用任何图片替换标志和横幅,我相信你会看到两个标志上都有一个空白 space 的空隙,一个在边缘之间徽标和应用程序,徽标和横幅之间的一个。为什么会这样? (编辑:我做了更多研究,终于找到了解决方案)
非常感谢您的回复。
- 您必须添加
bd=5
(边框大小)
- 首先不要混用
pack()
和grid()
。其次,当您将 btn 添加到底部框架时,框架采用按钮的大小。您必须使用 BottomFrame.propagate(0)
忽略按钮大小。
使用 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()
这是我正在制作的 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()
我有几个问题:
为什么左边框上的RAISE浮雕不显示? (编辑:此问题已回答)
为什么左右边框的bg变了,而下面的没有? (编辑:此问题已回答)
如果你用任何图片替换标志和横幅,我相信你会看到两个标志上都有一个空白 space 的空隙,一个在边缘之间徽标和应用程序,徽标和横幅之间的一个。为什么会这样? (编辑:我做了更多研究,终于找到了解决方案)
非常感谢您的回复。
- 您必须添加
bd=5
(边框大小) - 首先不要混用
pack()
和grid()
。其次,当您将 btn 添加到底部框架时,框架采用按钮的大小。您必须使用BottomFrame.propagate(0)
忽略按钮大小。
使用 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()