Ни одна из тем, которые я пробовал в ttkthemes, не будет оформлять все окно. Я применяю тему к корню/себе, и это будет только тема текста/кнопок.
Скриншоты:
Я ожидал, что окно заполнится полностью, может быть, я чего-то упускаю?
Код:
class Window(ThemedTk):
def __init__(self):
ThemedTk.__init__(self)
self.tk.call('lappend', 'auto_path', 'correct_path_to_theme')
self.tk.call('package', 'require', 'awdark')
s = ttk.Style()
s.theme_use("awdark")
# frame all content will sit inside of
mainframe = ttk.Frame(self, width=self.width, height=self.height)
mainframe.pack(side = "top", fill = "both", expand=True)
self.frames = {}
for F in (
HomePage,
):
frame = F(mainframe, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky = "nsew")
self.show_frame(HomePage)
def show_frame(self, fr):
frame = self.frames[fr]
frame.tkraise()
# Home Page of the app
class HomePage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
# header label
header_label = ttk.Label(
self, text = "Post Visual Inspection Board Capture Program", justify = "center"
)
header_label.pack()
# will start the new capture process
new_capture_buton = ttk.Button(
self,
text = "New Capture",
command=lambda: controller.show_frame(InstructionsPage),
)
new_capture_buton.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
@jasonharper спасибо, я все переключил на ttk и теперь все работает
Верхние уровни (включая главное окно) не являются тематическими виджетами. Они ничего не знают о системе тем. У них также есть другие важные возможности, которые делают простое повторение кода «но с темами» нетривиальным.
Простое решение (то есть то, что я всегда делал) — упаковать тематический фрейм внутри верхнего уровня в качестве единственного прямого дочернего элемента и заставить его всегда покрывать весь родительский фрейм. Затем поместите туда другие тематические виджеты. Технически это не тематический верхний уровень, но он выглядит и работает так же, как и был (при условии, что вы используете правильный дескриптор для работы с ним), так что этого достаточно.
[EDIT]: Подумав об этом еще немного, вы можете разместить тематический фрейм (сначала) внутри верхнего уровня с абсолютной позицией 0,0 и относительной шириной/высотой 1.0/1.0. Размещенные виджеты не участвуют в расчетах геометрии своего родителя, поэтому в данном случае это будет означать, что тематический фрейм просто находится позади всего остального. Именно так, как хотелось. Преимущество этого в том, что вы можете полностью забыть о тематическом фоне; вы упаковываете или размещаете свои виджеты на верхнем уровне точно так же, как и раньше.
Я всегда забываю россыпь. Он используется нечасто, но иногда это именно то, что вам нужно.
Большая часть того, что видно на вашем скриншоте, — это экземпляр
HomePage
, который представляет собой обычный фрейм Tk, и поэтому на него не влияет стиль ttk.