【问题标题】:Is it possible to dynamically scale a tkinter window?是否可以动态缩放 tkinter 窗口?
【发布时间】:2021-11-25 17:51:12
【问题描述】:

对于我目前的 Python 项目,我通常在大学里使用 x 大小的显示器工作,但是当我想在家工作时,我的屏幕要小得多。我的大多数小部件目前都是根据高度和宽度参数调整大小的,所以当我在家工作时,我的 Tkinter 框架已经调整为适合我的工作监视器,对于主屏幕来说太大了,只有大约三分之二然后我的框架内容出现在屏幕上。我正在使用网格几何。

即使小部件没有高度参数也会出现问题,例如,小部件的行数太多,无法适应我的小屏幕。

是否可以缩放 Tkinter 帧,这样当我回家处理项目时,我的窗口会按比例缩小以适应较小的屏幕?

下面是一个示例类:

class home_page(tk.Frame):

    def __init__(self, parent, controller):
        
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(background="white")
        h_title = tk.Label(self, text="Welcome to Fantasy Football!", fg="white", height=2, width=60, anchor="center", bg="#0ebf08", font=controller.title_font)
        h_squad_hub_lb = tk.Label(self, text="Squad Hub", fg="white", width=13, anchor="center", bg="#38003c", font=controller.title_font)
        squad_hub_text = "Selection headaches keeping you up\nat night? View your team below: "
        h_sh_text = tk.Label(self, text=squad_hub_text, bg="white", font=("Segoe UI", 13))
        h_view_team_bt = tk.Button(self, text="View Team", bg="#38003c", fg="white", command=lambda: controller.show_frame("pitch_view_team_page"))
        h_transfers_bt = tk.Button(self, text="Transfers", bg="#38003c", fg="white", command=lambda: controller.show_frame("pitch_view_transfers_page"))
        self.sh_img = PhotoImage(file = "Miscellaneous images/Squad Hub.png")
        h_sh_img = tk.Label(self, image=self.sh_img)
        h_rules_lb = tk.Label(self, text="Rules", fg="white", bg="#38003c", width=13, anchor="center", font=controller.title_font)
        rules_text = "Need to know the game before you can\ncrush it? Check out our rules below: "
        h_r_text = tk.Label(self, text=rules_text, bg="white", font=("Segoe UI", 13))
        h_selection_info_bt = tk.Button(self, text="Selection Info", bg="#38003c", fg="white", command=lambda: controller.show_frame("seli_rules_page"))
        h_scoring_info_bt = tk.Button(self, text="Scoring Info", bg="#38003c", fg="white", command=lambda: controller.show_frame("scoi_rules_page"))
        self.r_img = PhotoImage(file = "Miscellaneous images/Rules.png")
        h_r_img = tk.Label(self, image=self.r_img)
        h_stats_lb = tk.Label(self, text="Statistics", fg="white", bg="#38003c", width=13, anchor="center", font=controller.title_font)
        stats_text= "Want some hard facts to help decide on\nyour transfers? Check out the stats below: "
        h_s_text = tk.Label(self, text=stats_text, bg="white", font=("Segoe UI", 13))
        h_table_bt = tk.Button(self, text="League Table", bg="#38003c", fg="white", command=lambda: controller.show_frame("lgetbl_stats_page"))
        h_plrsts_bt = tk.Button(self, text="Player Stats", bg="#38003c", fg="white", command=lambda: controller.show_frame("plrsts_stats_page"))
        self.s_img = PhotoImage(file = "Miscellaneous images/Stats.png")
        h_s_img = tk.Label(self, image=self.s_img)
        h_news_lb = tk.Label(self, text="News", fg="white", width=13, anchor="center", bg="#38003c", font=controller.title_font)
        news_text = "Want to hear what your favourite team is\nup to? Check out club news below: "
        h_n_text = tk.Label(self, text=news_text, bg="white", font=("Segoe UI", 13))
        h_club_list_bt = tk.Button(self, text="Club List", bg="#38003c", fg="white", command=lambda: controller.show_frame("clli_stats_page"))
        h_preferences_bt = tk.Button(self, text="My Preferences", bg="#38003c", fg="white", command=lambda: controller.show_frame("mpref_settings_page"))
        self.n_img = PhotoImage(file = "Miscellaneous images/News.png")
        h_n_img = tk.Label(self, image=self.n_img)

        h_title.grid(row=0, column=0, columnspan=15, pady=(60,60))
        
        h_squad_hub_lb.grid(row=1, column=0, columnspan=3)
        h_sh_text.grid(row=2, column=0, columnspan=3, rowspan=3)
        h_sh_img.grid(row=2, column=3, rowspan=2)
        h_view_team_bt.grid(row=4, column=0, pady=(20,40))
        h_transfers_bt.grid(row=4, column=1, pady=(20,40))
        
        h_rules_lb.grid(row=1, column=11, columnspan=3)
        h_r_text.grid(row=2, column=11, columnspan=3, rowspan=2)
        h_r_img.grid(row=2, column=14, rowspan=2)
        h_selection_info_bt.grid(row=4, column=11, pady=(20,40))
        h_scoring_info_bt.grid(row=4, column=12, pady=(20,40))
        
        h_stats_lb.grid(row=5, column=0, columnspan=3)
        h_s_text.grid(row=6, column=0, columnspan=3, rowspan=2)
        h_s_img.grid(row=6, column=3, rowspan=2)
        h_table_bt.grid(row=8, column=0, pady=(20,40))
        h_plrsts_bt.grid(row=8, column=1, pady=(20,40))
        
        h_news_lb.grid(row=5, column=11, columnspan=3)
        h_n_text.grid(row=6, column=11, columnspan=3, rowspan=2)
        h_n_img.grid(row=6, column=14, rowspan=2)
        h_club_list_bt.grid(row=8, column=11, pady=(20,40))
        h_preferences_bt.grid(row=8, column=12, pady=(20,40)) 

【问题讨论】:

  • 你看过.winfo_screenwidth().winfo_screenheight()吗?也使用packgrid 而不是place
  • @Matiiss 道歉,我现在已经编辑声明我正在使用网格几何,我相信我可以使用打包进行缩放,但网格对于这个项目来说更实用。我会检查 .winfo 命令,谢谢
  • 除了.winfo_screenwidth() .winfo_screenheight()之外,还有winfo_fpixels()winfo_fpixels()可以将英寸和厘米等物理单位转换为像素。返回值在使用 place 布局管理器以及指定小部件的大小(宽度或高度)时很有用,例如 width=10c 为 10 厘米。
  • 请提供您目前所做的代码示例,以便我们为您提供适当的帮助。
  • 由于多种原因,我们无法运行您发布的代码。请尝试提供一个不使用图像的示例,或者使用不依赖外部文件的空白图像(例如:PhotoImage(width=32, height=32))。您的问题文本说您对大多数小部件使用宽度和高度,但这里只有一个小部件具有高度。另外,请描述您需要使 UI 变得多小。当我删除图像时,此代码小于 700x500。

标签: python tkinter tkinter-layout


【解决方案1】:

作为一般经验法则,您应该只为您真正关心宽度和高度的小部件提供宽度和高度,例如文本小部件、列表框或树视图。您通常不需要为框架或整个窗口指定大小。

当您指定尺寸时,您应该选择必要的最小尺寸,然后使用packplacegrid 选项允许在窗口增大或缩小时调整小部件的大小。

如果没有关于您的特定问题的更多细节,我们将无法提供更具体的建议。

【讨论】:

  • 我已经编辑以在我的代码中提供一个示例类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2012-04-27
  • 1970-01-01
相关资源
最近更新 更多