如何以正确的方式将 sqlite3 中的图像和值插入到 tkinter 树视图中?
How to insert image and values from sqllite3 into tkinter treeview the right way?
我正在尝试从 sqllite3 数据库中获取图像和一些值并将它们插入到 Tkinter Treeview 中,但是我在正确列上的记录位置以及图像大小方面遇到了问题,那么如何将每个值放在正确的位置并调整图像大小,使其适合正确的列。
很抱歉代码太长,但我正在努力澄清问题
示例:
我的代码脚本:
#load image
def filedialogs(self):
global filename, img, images
f_types = [("png", "*.png"), ("jpg", "*.jpg"), ("Allfile", "*.*")]
filename = filedialog.askopenfilename(filetypes=f_types)
img = Image.open(filename)
img = img.resize((365, 270), Image.ANTIALIAS)
img = ImageTk.PhotoImage(img)
# added infos,image into db
def Add_car(self):
global img, filename
self.fob = open(filename, 'rb')
self.fob = self.fob.read()
entities = (self.makecb.get(),self.modelcb.get(), self.Yearcb.get(),self.lincesplatenum.get(),self.price.get(),self.price.get())
self.con = sqlite3.connect('car dealership.db')
self.cursorObj = self.con.cursor()
self.cursorObj.execute(
'''INSERT INTO Vechicle_info(carmake, carmodel, caryear,carlincesplatenum, image,price) VALUES(?,?,?,?,?,?)''',
entities)
self.con.commit()
self.cursorObj.close()
def expenses(self):
self.carstoselecet_expensetree = ttk.Treeview(self.cartoselectframe,columns=["image", "price", "licenseplate", "year","model", "brand"])
self.carstoselecet_expensetree.pack()
self.carstoselecet_expensetree.heading("brand", text="car brand")
self.carstoselecet_expensetree.heading("model", text="car model")
self.carstoselecet_expensetree.heading("year", text="car year")
self.carstoselecet_expensetree.heading("licenseplate", text="car licenseplate")
self.carstoselecet_expensetree.heading("price", text="car price")
self.carstoselecet_expensetree.heading("image", text="car image")
self.carstoselecet_expensetree.column("brand", width=125)
self.carstoselecet_expensetree.column("model", width=100)
self.carstoselecet_expensetree.column("year", width=100)
self.carstoselecet_expensetree.column("licenseplate", width=100)
self.carstoselecet_expensetree.column("price", width=100)
self.carstoselecet_expensetree.column("image",width=500)
self.cursorObj = self.con.cursor()
self.my_row=self.cursorObj.execute('SELECT image, price, carlincesplatenum, caryear, carmodel, carmake FROM Vechicle_info')
self.cars_expense_output = self.cursorObj.fetchall()
# fetch values from db and insert them into treeview
self.imglist=[]
for record in self.cars_expense_output:
img=ImageTk.PhotoImage(data=record[0])
self.carstoselecet_expensetree.insert("",END,image=img,values=record[1:])
self.imglist.append(img)
self.con.commit()
有几个问题:
- 插入数据库时使用原始图像(从文件读取)而不是调整大小后的图像
self.price.get()
在 entities
中使用了两次,第一个应该是 self.fob
而不是
image
列应删除,因为图像显示在 树列“#0” 中
- 您需要将树视图的
rowheight
设置为图像的高度
以下是修复上述问题的修改代码:
#load image
def filedialogs(self):
f_types = [("png", "*.png"), ("jpg", "*.jpg"), ("Allfile", "*.*")]
filename = filedialog.askopenfilename(filetypes=f_types)
img = Image.open(filename)
img = img.resize((365, 270), Image.ANTIALIAS)
# save the resized image to self.fob
with io.BytesIO() as f:
img.save(f, 'PNG')
self.fob = f.getvalue()
# added infos,image into db
def Add_car(self):
# changed first self.price.get() to self.fob
entities = (self.makecb.get(), self.modelcb.get(), self.Yearcb.get(), self.lincesplatenum.get(), self.fob, self.price.get())
self.con = sqlite3.connect('car dealership.db')
self.cursorObj = self.con.cursor()
self.cursorObj.execute(
'''INSERT INTO Vechicle_info (carmake, carmodel, caryear, carlincesplatenum, image, price) VALUES (?,?,?,?,?,?)''',
entities)
self.con.commit()
self.cursorObj.close()
def expenses(self):
# removed image column
self.carstoselecet_expensetree = ttk.Treeview(self.cartoselectframe,columns=["price", "licenseplate", "year","model", "brand"])
self.carstoselecet_expensetree.pack()
# set treeview rowheight option
s = ttk.Style()
s.configure('Treeview', rowheight=270)
self.carstoselecet_expensetree.heading("brand", text="car brand")
self.carstoselecet_expensetree.heading("model", text="car model")
self.carstoselecet_expensetree.heading("year", text="car year")
self.carstoselecet_expensetree.heading("licenseplate", text="car licenseplate")
self.carstoselecet_expensetree.heading("price", text="car price")
self.carstoselecet_expensetree.heading("#0", text="car image") # changed "image" to "#0" (tree column)
self.carstoselecet_expensetree.column("brand", width=125)
self.carstoselecet_expensetree.column("model", width=100)
self.carstoselecet_expensetree.column("year", width=100)
self.carstoselecet_expensetree.column("licenseplate", width=100)
self.carstoselecet_expensetree.column("price", width=100)
self.carstoselecet_expensetree.column("#0",width=400) # changed "image" to "#0" (tree column)
self.cursorObj = self.con.cursor()
self.my_row = self.cursorObj.execute('SELECT image, price, carlincesplatenum, caryear, carmodel, carmake FROM Vechicle_info')
self.cars_expense_output = self.cursorObj.fetchall()
# fetch values from db and insert them into treeview
self.imglist=[]
for record in self.cars_expense_output:
img=ImageTk.PhotoImage(data=record[0])
self.carstoselecet_expensetree.insert("",END,image=img,values=record[1:])
self.imglist.append(img)
self.con.commit()
我正在尝试从 sqllite3 数据库中获取图像和一些值并将它们插入到 Tkinter Treeview 中,但是我在正确列上的记录位置以及图像大小方面遇到了问题,那么如何将每个值放在正确的位置并调整图像大小,使其适合正确的列。
很抱歉代码太长,但我正在努力澄清问题
示例:
我的代码脚本:
#load image
def filedialogs(self):
global filename, img, images
f_types = [("png", "*.png"), ("jpg", "*.jpg"), ("Allfile", "*.*")]
filename = filedialog.askopenfilename(filetypes=f_types)
img = Image.open(filename)
img = img.resize((365, 270), Image.ANTIALIAS)
img = ImageTk.PhotoImage(img)
# added infos,image into db
def Add_car(self):
global img, filename
self.fob = open(filename, 'rb')
self.fob = self.fob.read()
entities = (self.makecb.get(),self.modelcb.get(), self.Yearcb.get(),self.lincesplatenum.get(),self.price.get(),self.price.get())
self.con = sqlite3.connect('car dealership.db')
self.cursorObj = self.con.cursor()
self.cursorObj.execute(
'''INSERT INTO Vechicle_info(carmake, carmodel, caryear,carlincesplatenum, image,price) VALUES(?,?,?,?,?,?)''',
entities)
self.con.commit()
self.cursorObj.close()
def expenses(self):
self.carstoselecet_expensetree = ttk.Treeview(self.cartoselectframe,columns=["image", "price", "licenseplate", "year","model", "brand"])
self.carstoselecet_expensetree.pack()
self.carstoselecet_expensetree.heading("brand", text="car brand")
self.carstoselecet_expensetree.heading("model", text="car model")
self.carstoselecet_expensetree.heading("year", text="car year")
self.carstoselecet_expensetree.heading("licenseplate", text="car licenseplate")
self.carstoselecet_expensetree.heading("price", text="car price")
self.carstoselecet_expensetree.heading("image", text="car image")
self.carstoselecet_expensetree.column("brand", width=125)
self.carstoselecet_expensetree.column("model", width=100)
self.carstoselecet_expensetree.column("year", width=100)
self.carstoselecet_expensetree.column("licenseplate", width=100)
self.carstoselecet_expensetree.column("price", width=100)
self.carstoselecet_expensetree.column("image",width=500)
self.cursorObj = self.con.cursor()
self.my_row=self.cursorObj.execute('SELECT image, price, carlincesplatenum, caryear, carmodel, carmake FROM Vechicle_info')
self.cars_expense_output = self.cursorObj.fetchall()
# fetch values from db and insert them into treeview
self.imglist=[]
for record in self.cars_expense_output:
img=ImageTk.PhotoImage(data=record[0])
self.carstoselecet_expensetree.insert("",END,image=img,values=record[1:])
self.imglist.append(img)
self.con.commit()
有几个问题:
- 插入数据库时使用原始图像(从文件读取)而不是调整大小后的图像
self.price.get()
在entities
中使用了两次,第一个应该是self.fob
而不是image
列应删除,因为图像显示在 树列“#0” 中
- 您需要将树视图的
rowheight
设置为图像的高度
以下是修复上述问题的修改代码:
#load image
def filedialogs(self):
f_types = [("png", "*.png"), ("jpg", "*.jpg"), ("Allfile", "*.*")]
filename = filedialog.askopenfilename(filetypes=f_types)
img = Image.open(filename)
img = img.resize((365, 270), Image.ANTIALIAS)
# save the resized image to self.fob
with io.BytesIO() as f:
img.save(f, 'PNG')
self.fob = f.getvalue()
# added infos,image into db
def Add_car(self):
# changed first self.price.get() to self.fob
entities = (self.makecb.get(), self.modelcb.get(), self.Yearcb.get(), self.lincesplatenum.get(), self.fob, self.price.get())
self.con = sqlite3.connect('car dealership.db')
self.cursorObj = self.con.cursor()
self.cursorObj.execute(
'''INSERT INTO Vechicle_info (carmake, carmodel, caryear, carlincesplatenum, image, price) VALUES (?,?,?,?,?,?)''',
entities)
self.con.commit()
self.cursorObj.close()
def expenses(self):
# removed image column
self.carstoselecet_expensetree = ttk.Treeview(self.cartoselectframe,columns=["price", "licenseplate", "year","model", "brand"])
self.carstoselecet_expensetree.pack()
# set treeview rowheight option
s = ttk.Style()
s.configure('Treeview', rowheight=270)
self.carstoselecet_expensetree.heading("brand", text="car brand")
self.carstoselecet_expensetree.heading("model", text="car model")
self.carstoselecet_expensetree.heading("year", text="car year")
self.carstoselecet_expensetree.heading("licenseplate", text="car licenseplate")
self.carstoselecet_expensetree.heading("price", text="car price")
self.carstoselecet_expensetree.heading("#0", text="car image") # changed "image" to "#0" (tree column)
self.carstoselecet_expensetree.column("brand", width=125)
self.carstoselecet_expensetree.column("model", width=100)
self.carstoselecet_expensetree.column("year", width=100)
self.carstoselecet_expensetree.column("licenseplate", width=100)
self.carstoselecet_expensetree.column("price", width=100)
self.carstoselecet_expensetree.column("#0",width=400) # changed "image" to "#0" (tree column)
self.cursorObj = self.con.cursor()
self.my_row = self.cursorObj.execute('SELECT image, price, carlincesplatenum, caryear, carmodel, carmake FROM Vechicle_info')
self.cars_expense_output = self.cursorObj.fetchall()
# fetch values from db and insert them into treeview
self.imglist=[]
for record in self.cars_expense_output:
img=ImageTk.PhotoImage(data=record[0])
self.carstoselecet_expensetree.insert("",END,image=img,values=record[1:])
self.imglist.append(img)
self.con.commit()