我正在尝试使用 customtkinter 显示 MySQL 数据库的内容,但表的位置与我在网格中分配的位置不匹配。我对 GUI 编程还很陌生,所以我希望得到你的帮助。这是我的代码:
import customtkinter
import mysql.connector
import pandas as pd
from pandastable import Table, TableModel
conn = mysql.connector.connect(user='root', password='0000', host='localhost', database='python', auth_plugin='mysql_native_password')
cursor = conn.cursor()
class MyFrame(customtkinter.CTkFrame):
def __init__(self, master):
super().__init__(master)
self.header = customtkinter.CTkLabel(self, text="Dashboard", fg_color="transparent", font=("Product Sans",48))
self.header.grid(row=0, column=0, sticky="w")
command = "select * from fruits"
table_width = 310
table_height = 100
df = pd.read_sql_query(command, conn)
pt = Table(self, dataframe=df, width=table_width, height=table_height, showtoolbar=False, showstatusbar=False, showRowNumber=False)
pt.grid(row=310, column=0)
pt.show()
pt.hideRowHeader()
class App(customtkinter.CTk):
def __init__(self):
super().__init__()
self.title("my app")
self.geometry("1280x720")
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)
self.frame = MyFrame(self)
self.frame.grid(row=0, column=0, sticky='nw')
self.frame.configure(width=1280, height=720)
self.button = customtkinter.CTkButton(self, text="my button")
self.button.grid(row=3, column=0, padx=10, pady=10, sticky="ew")
app = App()
app.mainloop()
我希望表格位于标题“仪表板”下方,但它附着在侧面,并且滚动条也不断出现故障。
请注意,
pandastable.Table
有不同的部分,它们被放置在相同的父框架中(self
,您的案例的MyFrame
的实例)。 其中一个部分 rowindexheader
位于第 0 行第 0 列(与标签“Dashboard”相同的位置)。 但它是通过在代码中调用 pt.hideRowHeader()
来隐藏的,因此您可以看到标签“Dashboard”。 如果删除行 pt.hideRowHeader()
,标签“Dashboard”将被 行标题覆盖。
您可以将标签“Dashboard”移出
MyFrame
类,并在 MyFrame
实例的同一父级中创建它。
下面是一个基于您的简化示例:
import customtkinter as ctk
from pandastable import Table
ctk.set_appearance_mode("dark")
class MyFrame(ctk.CTkFrame):
def __init__(self, master):
super().__init__(master)
table_width = 310
table_height = 100
pt = Table(self, width=table_width, height=table_height,
showtoolbar=False, showstatusbar=False, showRowNumber=False)
pt.show()
pt.hideRowHeader()
root = ctk.CTk()
root.geometry("400x300")
header = ctk.CTkLabel(root, text="Dashboard", fg_color="transparent",
font=("Product Sans", 48))
header.pack()
frame = MyFrame(root)
frame.pack(fill="both", expand=1)
root.mainloop()
输出: