tkinter - 使用按钮在帧之间来回切换

2024-06-19

我需要功能,最好是一个功能,当按下下一页和后退按钮时可以在页面之间来回切换。我想这可以通过将布尔变量分配给后退和下一页按钮来完成(不确定是否可以这样做)来确定您是否要前进或后退所有页面的有序列表。需要知道当前升高的框架的索引。索引可用于找出下一页,然后将其提升。如果当前索引为 0 或最后一个索引(在本例中为 2),并且分别按“后退”或“下一步”,那么您将转到主页类框架,在本例中为 BlankPage。

import tkinter as tk
from tkinter import ttk

class Program(tk.Tk):        
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.iconbitmap(self, default = "")
        tk.Tk.wm_title(self, "")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (Add, BlankPage):

            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row = 0, column = 0, sticky = "nsew")

        self.show_frame(Add)

    def show_frame(self,cont):
        frame = self.frames[cont]
        frame.tkraise()

class Add(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        innerFrame = tk.Frame(self)
        innerFrame.place(relx=.5, rely=.5, anchor="c", relwidth=1.0, relheight=1.0)

        innerFrame.grid_rowconfigure(1, weight=1)
        innerFrame.grid_columnconfigure(0, weight=1)

        name = tk.Label(innerFrame, text = "User")
        name.grid(row=0, sticky="NE")

        pagename = tk.Label(innerFrame, text = "Label")
        pagename.grid(row=0, sticky="N")

        next = ttk.Button(innerFrame, text = "Next", command = self.changePage)
        next.grid(row=2, sticky="E")

        back = ttk.Button(innerFrame, text = "Back", command = self.changePage)
        back.grid(row=2, sticky="W")

########################################################################################################### 

        self.pageThree = tk.Frame(innerFrame)
        self.pageThree.grid(row=1)

        self.pageThree.grid_rowconfigure(0, weight=1)
        self.pageThree.grid_columnconfigure(0, weight=1)

        pagename = tk.Label(self.pageThree, text = "Page 3")
        pagename.grid(row=0, sticky="N")

########################################################################################################### 

        self.pageTwo = tk.Frame(innerFrame)
        self.pageTwo.grid(row=1)

        self.pageTwo.grid_rowconfigure(0, weight=1)
        self.pageTwo.grid_columnconfigure(0, weight=1)

        pagename = tk.Label(self.pageTwo, text = "Page 2")
        pagename.grid(row=0, sticky="N")

########################################################################################################### 

        self.pageOne = tk.Frame(innerFrame)
        self.pageOne.grid(row=1)

        self.pageOne.grid_rowconfigure(0, weight=1)
        self.pageOne.grid_columnconfigure(0, weight=1)

        pagename = tk.Label(self.pageOne, text = "Page 1")
        pagename.grid(row=0, sticky="N")

########################################################################################################### 

    def changePage(self,buttonBool):
        pages = [self.pageOne,self.pageTwo,self.pageThree]
        #find current raised page and set to variable 'current'
        position = pages.index(current)
        if (postion==0 and buttonBool==False) or (postion==len(pages)-1 and buttonBool==True):
            show_frame(BlankPage)
        elif buttonBool==True:
            pages[position+1].tkraise()
        else:
            pages[position-1].tkraise()


class BlankPage(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)


app = Program()
app.state('zoomed')
app.mainloop()

changePage 函数是我的尝试,我将如何完成它?


你已经非常接近让一切正常工作了,在我自己看了一些之后,我找不到任何(不是过于复杂的)方法来找出最上面的Frame所以最好只记录当前位置:

def __init__(self, parent, controller):

    ...

    self.position = 0 #the index of the pages list

并得到buttonBool传递给changePage你可以来自这里的东西 https://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter(Tlapička 给出了我眼中最好的解决方案,因为lambda表达式使代码行太长)

def __init__(self, parent, controller):
    ...
    # button commands don't have an event but sometimes you use these callbacks for both .bind and buttons
    # so having event=None makes it work for both.
    def go_next(event=None):
        self.changePage(True)

    next = ttk.Button(innerFrame, text = "Next", command = go_next)
    next.grid(row=2, sticky="E")

    def go_back(event=None):
        self.changePage(False)

    back = ttk.Button(innerFrame, text = "Back", command = go_back)
    back.grid(row=2, sticky="W")

    ...

有了这两个(并实施self.position into changePage)你可以完成你最初要求的,下面的所有内容都是代码审查员 http://codereview.stackexchange.com在我说话的时候。


尽管使用布尔值可行,但这种处理回调的额外参数的策略可以让您通过any论证成changePage所以它可能会简化条件changePage如果页面发生变化(因此 1 或 -1):

    def go_next(event=None):
        self.changePage(1)

    next = ttk.Button(innerFrame, text = "Next", command = go_next)
    next.grid(row=2, sticky="E")

    def go_back(event=None):
        self.changePage(-1)

    back = ttk.Button(innerFrame, text = "Back", command = go_back)
    back.grid(row=2, sticky="W") 

    #this is for the last suggestion
    self.nextButton = next
    self.backButton = back
    ...

then changePage可能看起来像这样,虽然我不确定会发生什么self.position如果您更改为无效页面:

def changePage(self,change):
    pages = [self.pageOne,self.pageTwo,self.pageThree]
    new_position = self.position + change
    if (new_postion < 0) or (new_postion <= len(pages)):
        show_frame(BlankPage)
        #not sure how you would handle the new position here
    else:
        pages[new_position].tkraise()
        self.position = new_position

更好的是,如果您保留对next and back按钮你可以config它们表明这是结束/开始:

def changePage(self,change):
    pages = [self.pageOne,self.pageTwo,self.pageThree]
    new_position = self.position + change
    if (0 <= new_postion < len(pages)):
        pages[new_position].tkraise()
        self.position = new_position
    else:
        show_frame(BlankPage)

    if new_position+1 >= len(pages):
        self.nextButton.config(text="End") #, state=tk.DISABLED)
    else:
        self.nextButton.config(text="Next") #, state=tk.NORMAL)

    if new_position-1 < 0:
        self.backButton.config(text="First") #, state=tk.DISABLED)
    else:
        self.backButton.config(text="Back") #, state=tk.NORMAL)

这样,即使内容没有指示,您也会知道何时到达终点。 (或者您可以禁用按钮以防止过去)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tkinter - 使用按钮在帧之间来回切换 的相关文章

随机推荐

  • Yii2 修改 Model search() 中的 find() 方法

    我试图修改模型搜索中的 find 方法 但它抛出错误 必须设置数据提供程序属性 这是我的搜索模型 public function search params userID Yii app gt user gt identity gt id
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 如何在 SVN 中分支单个文件?

    分支的颠覆概念似乎专注于创建整个存储库的 不稳定 分支 并在其上进行开发 是否有一种机制可以创建单个文件的分支 对于用例 请考虑具有多个特定于平台的源代码 c 实现的通用头文件 h 这种类型的分支是永久性的 所有这些分支都将不断发展 偶尔会
  • 在哪里可以下载 Java 8 基本配置文件?

    我的印象是 在版本 8 中 我们将能够下载我们需要的部分 jdk 并且它将具有完整的功能 我无法在任何地方找到 java 8 紧凑型配置文件 不是早期访问版本 简短回答 try 这个链接 http www oracle com techne
  • 检测 JPEG 图像质量

    我允许用户上传图像 但是 我希望保持 JPEG 质量不超过 90 我打算做的是检测当前的质量 如果低于 90 什么都不做 如果超过90 则使用Image Magick将图像重新压缩到90 可以这样做吗 我更喜欢 PHP 但任何语言都会有帮助
  • 如何在 Presto 中将数字格式化为保留 2 位小数的百分比?

    我有一个数字想在 Presto 中将其格式化为百分比 我想将 0 18932 格式化为 18 93 I tried format s decimal number 100 format s round a decimal number 10
  • iPhone SDK - orkut API

    我曾使用 gData 库从 iPhone 中的 Google 联系人中检索联系人信息 同样 我将与 Orkut 合作 有没有像 gData 这样适用于 Orkut 的库 如果是这样 请给我链接 提前致谢 对于 orkut 我们有 orkut
  • Android 平台上的客户端/对等点通过 wifi-direct 进行通信

    我有三个 Android 设备 A B 和 C 它们通过 wifi direct 连接 假设 B 是组所有者 我只有两个问题 1 A想要发送消息给C 消息是否必须经过群主B才能到达C 2 如果群主B意外断线 A还能给C发消息吗 Thanks
  • 如何使用 PyEphem 计算给定银河坐标(GLON,GLAT)的(alt,az)?

    对于地球上给定的观察者 lon lat time 和给定的银河坐标 GLON GLAT 如何使用 PyEphem 计算天空中相应的 alt az 点 鉴于 PyEphem 目前的工作方式 有两个步骤可以回答您的问题 首先 您必须将一对银河坐
  • 通过插件以编程方式修改 Eclipse 工作区和 CDT 选项

    我想从插件中以编程方式修改 Eclipse 工作区 添加现有项目是我的主要请求 另外 我想从该插件中修改 CDT 选项 环境 索引器选项 有谁知道如何最好地做到这一点或者可以向我指出有关该主题的良好文档 EDIT 实际上我不想修改 CDT
  • PyQt:数据不可 JSON 序列化

    我是 PyQt GUI 的新手 我想获取a的数据QLineEdit文本框 为此我正在使用text 方法 我正在获取数据 但数据类型是QString 我需要将其作为 json 数据传输到服务器 为此我使用json dumps 方法 但我收到错
  • Android Studio 无法运行 Xcode 模拟器

    我正在尝试使用 Xcode iPhone 模拟器模拟我的 Flutter 应用程序 但收到此错误 在升级 Android Studio 和 Xcode 之前 它运行良好 Launching lib main dart on iPhone X
  • 从 UTC 转换为本地时区给出错误结果

    背景我需要将格式为 HH mm 的时间字符串从 UTC 转换为本地时区 例如 如果 UTC 时间为 09 00 则当地时间 斯德哥尔摩 欧洲 应提前两个小时 Problem当我将 09 00 UTC 转换为斯德哥尔摩 欧洲时间时 我得到 1
  • 如何从另一个片段运行一个片段

    我有一个主要活动 活动 1 它会膨胀导航抽屉 带有列表视图列出项目 抽屉由片段 MenuFragment 运行 以便我可以根据选择的项目来扩展任何 xml 布局 现在我的问题是当用户从抽屉中选择一个项目时如何运行另一个活动 活动 2 因为抽
  • const_cast 的自动类型推导不起作用

    在我的工作中使用const cast在某些情况下是不可避免的 现在我必须const cast一些非常复杂的类型 实际上我不想在const cast
  • 删除 arrayList 中的项目,java.lang.UnsupportedOperationException

    我想删除数组列表选择位置中的项目 我的代码是 List
  • 按列表中(不在)中的索引值对 Pandas 数据帧进行切片

    我有一个pandas数据框 df 我想选择所有索引df那是not在列表中 blacklist 现在 我使用列表理解来创建所需的切片标签 ix i for i in df index if i not in blacklist df sele
  • 如何向 ExtJS 应用添加自定义字体?

    同事 请建议如何向 ExtJS 添加自定义字体 以便它与应用程序一起加载 如果用户的系统中没有安装此字体 必须将其加载到哪个文件夹 以及应将其包含在何处以及如何包含 谢谢各位的解答 您只需添加新的字体文件即可myApp resources
  • 如何让 PowerShell 等待 Invoke-Item 完成?

    如何让 PowerShell 等待 Invoke Item 调用完成 我正在调用一个不可执行的项目 因此我需要使用 Invoke Item 来打开它 只需使用Start Process wait 例如Start Process wait c
  • tkinter - 使用按钮在帧之间来回切换

    我需要功能 最好是一个功能 当按下下一页和后退按钮时可以在页面之间来回切换 我想这可以通过将布尔变量分配给后退和下一页按钮来完成 不确定是否可以这样做 来确定您是否要前进或后退所有页面的有序列表 需要知道当前升高的框架的索引 索引可用于找出