求大神解答tkinter背景图设置问题
from tkinter import*from PIL import Image, ImageTk
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.pack(fill=BOTH, expand=1)
self.imgs = {
"微信": "wechat.png",
"支付宝": "alipay.png",
}
variable = StringVar()
variable.set("支付方式")
menu = OptionMenu(root, variable, *self.imgs.keys(), command=self.set_image)
menu.place(x=800,y=150)
text_label=Label(root,text="欢迎进入支付系统",font=("华康少女字体",20),fg="green").place(x=740,y=10)
canvas_root=root.Canvas(root,width=1600,height=900)
im_root=get_image('bg.jpg',1600,900)
canvas_root.create_image(800,450,image=im_root)
canvas_root.pack()
def set_image(self, val):
load = Image.open(self.imgs.get(val))
render = ImageTk.PhotoImage(load)
img = Label(self, image=render)
img.image = render
img.place(x=450, y=200)
def get_image(filename,width,height):
im = Image.open(filename).resize((width,height))
return ImageTk.PhotoImage(im)
root = Tk()
app = Window(root)
root.title("支付系统")
root.geometry("1600x900")
root.resizable(width=False, height=False)
root.mainloop() 你能说明一下问题吗?
我先说说我看到的问题吧:
1. canvas_root=root.Canvas(root,width=1600,height=900)这行代码应该是 canvas_root=Canvas(root,width=1600,height=900) 因为你导包的时候是 from tkinter import*
2. 你设置了背景图的话,其他的组件都应该在这个Canvas之上,即括号里面的参数的父组件root,都应该换成Canvas,而且这些组件都应该在该背景图后定义,否则背景图的图层就会覆盖掉这些组件,看不见了
3. def get_image(filename,width,height): 类中的方法第一个参数应该是self, im_root=get_image('bg.jpg',1600,900) 这句代码你在调用这个函数的时候会报错
来自星星的小明 发表于 2021-2-23 14:49
你能说明一下问题吗?
我先说说我看到的问题吧:
1. canvas_root=root.Canvas(root,width=1600,height=90 ...
我这样改对吗,但还是报错Traceback (most recent call last):
File "E:\ceshi.py", line 6, in <module>
canvas_root=Canvas(self,width=1600,height=900)
NameError: name 'self' is not defined。还有我这个思路对吗。我想实现加整个背景图。麻烦大神指导指导,小弟刚学python
from tkinter import*
from PIL import Image, ImageTk
def get_image(self,width,height):
im = Image.open(self).resize((width,height))
return ImageTk.PhotoImage(im)
canvas_root=Canvas(self,width=1600,height=900)
im_root=get_image('bg.jpg',1600,900)
canvas_root.create_image(800,450,image=im_root)
canvas_root.pack()
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.pack(fill=BOTH, expand=1)
self.imgs = {
"微信": "wechat.png",
"支付宝": "alipay.png",
}
variable = StringVar()
variable.set("支付方式")
menu = OptionMenu(Canvas, variable, *self.imgs.keys(), command=self.set_image)
menu.place(x=800,y=150)
text_label=Label(Canvas,text="欢迎进入支付系统",font=("华康少女字体",20),fg="green").place(x=740,y=10)
def set_image(self, val):
load = Image.open(self.imgs.get(val))
render = ImageTk.PhotoImage(load)
img = Label(self, image=render)
img.image = render
img.place(x=450, y=200)
root = Tk()
app = Window(root)
root.title("支付系统")
root.geometry("1600x900")
root.resizable(width=False, height=False)
root.mainloop() 本帖最后由 来自星星的小明 于 2021-2-24 12:13 编辑
在python中,所有的类都直接或间接继承自Object类,定义了类之后就定义了一个命名空间,里面定义的属性可以通过类名来引用。新定义的类中有一些Object中有的属性,可以在其中定义其他变量或者函数。实例化之后会创建一个对象,该对象脱胎于类,并且其中的属性动态地和类中的属性产生关联。
python类中的方法函数指的是通过类的实例化对象调用的函数,方法函数的第一个形参表示类的实例化对象,通常写成self
执行 app = Window(root)
app.get_image(filename='bg.jpg', width=1600, height=900)
时就相当于执行Window.get_image(app, filename='bg.jpg', width=1600, height=900)
上面是关于self的用法,感觉你还是混淆的,我直接给你改了吧,你可以对比的看一下,还有什么问题可以接着留言:
from tkinter import*
from PIL import Image, ImageTk
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.pack(fill=BOTH, expand=1)
self.imgs = {
"微信": "wechat.png",
"支付宝": "alipay.png",
}
variable = StringVar()
variable.set("支付方式")
canvas_root=Canvas(root,width=1600,height=900)
im_root=self.get_image(r'C:/Users/me/Desktop/bg.jpg',1600,900) #此处的路径是背景图片的地址
canvas_root.create_image(800,450,image=im_root)
canvas_root.pack()
menu = OptionMenu(canvas_root, variable, *self.imgs.keys(), command=self.set_image) #这里你调用的这个函数,需要一个参数呀!我没看明白你这个函数是干嘛用的
menu.place(x=800,y=150)
text_label=Label(canvas_root,text="欢迎进入支付系统",font=("华康少女字体",20),fg="green").place(x=740,y=10)
def set_image(self, val):
load = Image.open(self.imgs.get(val))
render = ImageTk.PhotoImage(load)
img = Label(self, image=render)
img.image = render
img.place(x=450, y=200)
def get_image(self,filename,width,height):
im = Image.open(filename).resize((width,height))
self.photo = ImageTk.PhotoImage(im)
return self.photo
root = Tk()
app = Window(root)
root.title("支付系统")
root.geometry("1600x900")
root.resizable(width=False, height=False)
root.mainloop() 来自星星的小明 发表于 2021-2-24 12:06
在python中,所有的类都直接或间接继承自Object类,定义了类之后就定义了一个命名空间,里面定义的属性可以 ...
menu = OptionMenu(canvas_root, variable, *self.imgs.keys(), command=self.set_image) #这里是当我选择微信或者支付宝时,它会根据我不同的选择跳转不同的二维码。但是在我加了背景图后就不显示了,也不跳错 zyfeng 发表于 2021-2-26 08:54
menu = OptionMenu(canvas_root, variable, *self.imgs.keys(), command=self.set_image) #这 ...
是不是被覆盖了,但我看也没有啊,二维码图片就消失了,无法调用了。要怎么把二维码图片放在图片上层啊 你设置了背景图的话,其他的组件都应该在这个Canvas之上, img = Label(self, image=render) Label的父组件就是Canvas啊。请看:
from tkinter import*
from PIL import Image, ImageTk
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.pack(fill=BOTH, expand=1)
self.imgs = {
"微信": "C:/Users/me/Desktop/wechat.jpg", #图片地址
"支付宝": "C:/Users/me/Desktop/alipay.jpg", #图片地址
}
variable = StringVar()
variable.set("支付方式")
self.canvas_root=Canvas(root,width=1600,height=900)
im_root=self.get_image(r'C:/Users/me/Desktop/bg.jpg',1600,900)
self.canvas_root.create_image(800,450,image=im_root)
self.canvas_root.pack()
menu = OptionMenu(self.canvas_root, variable, *self.imgs.keys(), command=self.set_image)
menu.place(x=800,y=150)
text_label=Label(self.canvas_root,text="欢迎进入支付系统",font=("华康少女字体",20),fg="green").place(x=740,y=10)
def set_image(self, val):
load = Image.open(self.imgs.get(val))
render = ImageTk.PhotoImage(load)
img = Label(self.canvas_root, image=render)
img.image = render
img.place(x=450, y=200)
def get_image(self,filename,width,height):
im = Image.open(filename).resize((width,height))
self.photo = ImageTk.PhotoImage(im)
return self.photo
root = Tk()
app = Window(root)
root.title("支付系统")
root.geometry("1600x900")
root.resizable(width=False, height=False)
root.mainloop() 来自星星的小明 发表于 2021-2-26 16:55
你设置了背景图的话,其他的组件都应该在这个Canvas之上, img = Label(self, image=render) Label的父组件 ...
一直跳这个错误,是什么原因
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\ceshi5.py", line 40, in <module>
app = Window(root)
File "C:\Users\Administrator\Desktop\ceshi5.py", line 19, in __init__
im_root=self.get_image('bg.jpg',1600,900)
File "C:\Users\Administrator\Desktop\ceshi5.py", line 35, in get_image
im = Image.open(filename).resize((width,height))
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\PIL\Image.py", line 2904, in open
fp = builtins.open(filename, "rb")
FileNotFoundError: No such file or directory: 'bg.jpg' im_root=self.get_image(r'C:/Users/me/Desktop/bg.jpg',1600,900)
你看报错信息,最后一行,没找到文件,你把类似背景图 的地址和文件类型换成你的。
页:
[1]