2014-04-18 13 views
5

Ho lavorato su un editor di testo usando Tkinter in Python 2.7. Una funzione che sto cercando di implementare è la modalità notturna, in cui l'utente può passare da uno sfondo nero a uno chiaro, che passa da chiaro a scuro con un clic del pulsante di attivazione/disattivazione.Python Tkinter: come creare un pulsante di attivazione/disattivazione?

#!/usr/bin/env python 

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 
/(code)/ 
class Editor(ScrolledText): 

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

    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 

Tuttavia, durante l'esecuzione del codice, è sempre in modalità notte e l'interruttore non funziona. Aiuto. Codice sorgente: http://ideone.com/IVJuxX

risposta

0

Lo sfondo e fg sono impostati solo nella clausola if. È necessario porre anche nella clausola 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 

cioè,

else: 
    self.text.config(font=('courier', 12, 'normal'), background='green', fg='black') 
+1

il 'UnboundLocalError' è a causa dell'assegnazione a 'index' che la rende una variabile locale di default quando si desidera che si riferisca alla variabile globale. La soluzione rapida consiste nell'aggiungere l'istruzione 'indice globale' all'interno della funzione. Ma una soluzione migliore sarebbe evitare di usare un mutabile globale e invece rendere 'index' un attributo di istanza,' self.index'. – unutbu

1

È possibile importare biblioteca tkinter (lettera maiuscola Usa per Python 2.7):

import Tkinter 

Crea oggetti tkinter ...

root = tk.Tk() 

... e il pulsante tkinter

toggle_btn = tk.Button(text="Toggle", width=12, relief="raised") 
toggle_btn.pack(pady=5) 
root.mainloop() 

Ora creare un nuovo pulsante di comando denominato "toggle" al fine di creare l'effetto di "toggle" quando si preme a giocare sulla proprietà rilievo (affondata o in rilievo) :

def toggle(): 

    if toggle_btn.config('relief')[-1] == 'sunken': 
     toggle_btn.config(relief="raised") 
    else: 
     toggle_btn.config(relief="sunken") 

alla fine applicare questo comportamento nel pulsante:

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

Il tuo codice non è formattato correttamente. Inoltre, le risposte al solo codice non sono generalmente valide con il codice più una spiegazione. Puoi spiegare un po 'perché il tuo codice risolve il problema? –

+0

Non conosco bene l'inglese, ma conosco molto bene python: Cosa intendi con formattazione specifica? Per Python 2.7 funziona bene !!!! Copia e incolla in un file di testo e salvalo come .py! Test prima di dare un commento negativo !!! – Albe

+0

Al momento in cui ho scritto il commento, il corpo di 'toggle' era rientrato nello stesso modo dell'istruzione' def' e potevi _non_ copiarlo e incollarlo. Guarda la cronologia delle modifiche e vedrai che la tua versione originale è stata modificata da qualcun altro per correggere il rientro. –

Problemi correlati