Python 如何创建tkinter切换按钮?

Python 如何创建tkinter切换按钮?,python,tkinter,toggle,python-2.x,Python,Tkinter,Toggle,Python 2.x,我一直在使用Python2.7中的Tkinter开发一个文本编辑器。 我尝试实现的一个功能是夜间模式,用户可以在黑色背景和浅色背景之间切换,只需单击切换按钮即可从浅色切换到深色 from Tkinter import * from tkSimpleDialog import askstring from tkFileDialog import asksaveasfilename from tkFileDialog import askopenfilename from tkMessag

我一直在使用Python2.7中的Tkinter开发一个文本编辑器。 我尝试实现的一个功能是夜间模式,用户可以在黑色背景和浅色背景之间切换,只需单击切换按钮即可从浅色切换到深色

from Tkinter import *

from tkSimpleDialog import askstring

from tkFileDialog   import asksaveasfilename
from tkFileDialog import askopenfilename

from tkMessageBox import askokcancel

Window = Tk() 
Window.title("TekstEDIT")
index = 0

class Editor(ScrolledText):

    Button(frm, text='Night-Mode',  command=self.onNightMode).pack(side=LEFT)

    def onNightMode(self):
    if index:
        self.text.config(font=('courier', 12, 'normal'), background='black', fg='green')

    else:
        self.text.config(font=('courier', 12, 'normal'))

    index = not index   
但是,在运行代码时,它始终处于夜间模式,切换不起作用。救命啊。
源代码:

背景和fg仅在if子句中设置。您还需要在
else
子句中设置它们:

def onNightMode(self):
    if index:
        self.text.config(font=('courier', 12, 'normal'), background='black', fg='green')

    else:
        self.text.config(font=('courier', 12, 'normal'))

    index = not index

i、 e


您可以导入tkinter库(python 2.7使用大写字母):

创建tkinter对象

root = tk.Tk()
…和tkinter按钮

toggle_btn = tk.Button(text="Toggle", width=12, relief="raised")
toggle_btn.pack(pady=5)
root.mainloop()
现在创建一个名为“toggle”的新命令按钮,以便在按下relief属性(凹陷或凸起)上的playing时创建“toggle”效果:

最后,在按钮上应用此行为:

toggle_btn = tk.Button(text="Toggle", width=12, relief="raised", command=toggle)

如果您愿意,这里有一个代码片段可以帮助您使用切换按钮动画。您只需在单击时添加要执行的函数,当然,这取决于您自己

'''
    import tkinter as tk

    # --- functions ---

    def move(steps=10, distance=0.1):
        if steps > 0:
            # get current position
            relx = float(frame.place_info()['relx'])

            # set new position
            frame.place_configure(relx=relx+distance)

            # repeate it after 10ms
            root.after(10, move, steps-1, distance)

    def toggle(event):
        if button["text"] == "Yes":
            move(25, 0.02)  # 50*0.02 = 1
            button["text"] = "No"
            print("Clicked on yes")
        elif button["text"] == "No":
            move(25, -0.02)
            button["text"] = "Yes"
            print("Clicked on no")


    # --- main --

    root = tk.Tk()

    frame = tk.Frame(root, background='red')
    frame.place(relx=0, rely=0, relwidth=0.5, relheight=1)

    # to center label and button
    #frame.grid_columnconfigure(0, weight=1)
    #frame.grid_rowconfigure(0, weight=1)
    #frame.grid_rowconfigure(3, weight=1)




    button = tk.Button(frame, text='Yes',width=5,height=1)
    button.place(relx=0.25,rely=0.5,relwidth=0.5, relheight=0.1)
    button.bind("<Button-1>",toggle)


    root.mainloop()
“”
将tkinter作为tk导入
#---功能---
def移动(步数=10,距离=0.1):
如果步骤>0:
#获取当前位置
relx=float(frame.place_info()['relx']))
#重新定位
帧位置配置(relx=relx+距离)
#10毫秒后重复
根。后(10,移动,步骤-1,距离)
def切换(事件):
如果按钮[“文本”]=“是”:
移动(25,0.02)#50*0.02=1
按钮[“文本”]=“否”
打印(“单击是”)
elif按钮[“文本”]=“否”:
移动(25,-0.02)
按钮[“文本”]=“是”
打印(“单击否”)
#---梅因--
root=tk.tk()
frame=tk.frame(根,背景为红色)
帧位置(relx=0,rely=0,relwidth=0.5,relheight=1)
#将标签和按钮居中
#frame.grid\u columnconfigure(0,权重=1)
#frame.grid_rowconfigure(0,权重=1)
#frame.grid_row配置(3,权重=1)
按钮=tk.按钮(框架,文本='Yes',宽度=5,高度=1)
按钮位置(relx=0.25,rely=0.5,relwidth=0.5,relheight=0.1)
按钮绑定(“,切换)
root.mainloop()

UnboundLocalError是由于分配给
索引而导致的,当您确实希望它引用全局变量时,默认情况下,它是一个局部变量。快速修复方法是在函数中添加语句
global index
。但更好的解决方法是避免使用可变全局变量,而是将
index
作为实例属性,
self.index
。您的代码格式不正确。此外,只有代码的答案通常不如代码加解释的答案好。你能解释一下为什么你的代码能解决这个问题吗?我不太懂英语,但我很懂python:什么是正确格式化?对于Python2.7,工作正常!!!!复制并粘贴到文本文件中,并将其另存为.py!在给出不好的评论之前进行测试!!!在我写评论时,
toggle
的主体与
def
语句缩进相同,您无法复制和粘贴它。看看编辑的历史,你会看到你的原始版本是由其他人编辑的,以修复缩进。这不是负面评论,我只是陈述了一个事实。我不想编辑答案,因为我认为您可能不知道如何正确格式化它(因为它最初是错误的),通过让您修复它,您将学会如何格式化您的答案。如果你被冒犯了,我很抱歉。我唯一的目的是帮助你写一个更好的答案。如果你编辑了这个答案,会比提供另一个同样信息的答案更好。
def toggle():

    if toggle_btn.config('relief')[-1] == 'sunken':
        toggle_btn.config(relief="raised")
    else:
        toggle_btn.config(relief="sunken")
toggle_btn = tk.Button(text="Toggle", width=12, relief="raised", command=toggle)
'''
    import tkinter as tk

    # --- functions ---

    def move(steps=10, distance=0.1):
        if steps > 0:
            # get current position
            relx = float(frame.place_info()['relx'])

            # set new position
            frame.place_configure(relx=relx+distance)

            # repeate it after 10ms
            root.after(10, move, steps-1, distance)

    def toggle(event):
        if button["text"] == "Yes":
            move(25, 0.02)  # 50*0.02 = 1
            button["text"] = "No"
            print("Clicked on yes")
        elif button["text"] == "No":
            move(25, -0.02)
            button["text"] = "Yes"
            print("Clicked on no")


    # --- main --

    root = tk.Tk()

    frame = tk.Frame(root, background='red')
    frame.place(relx=0, rely=0, relwidth=0.5, relheight=1)

    # to center label and button
    #frame.grid_columnconfigure(0, weight=1)
    #frame.grid_rowconfigure(0, weight=1)
    #frame.grid_rowconfigure(3, weight=1)




    button = tk.Button(frame, text='Yes',width=5,height=1)
    button.place(relx=0.25,rely=0.5,relwidth=0.5, relheight=0.1)
    button.bind("<Button-1>",toggle)


    root.mainloop()