web-dev-qa-db-fra.com

Comment changer l'arrière-plan d'un cadre dans Tkinter?

J'ai créé un programme Email en utilisant Tkinter, dans Python 3.3. Sur divers sites, j'ai vu que le widget Frame peut obtenir un arrière-plan différent en utilisant la fonction Frame.config(background="color"). Cependant, lorsque j'utilise ceci dans mes cadres, cela donne l'erreur suivante:

_tkinter.TclError: unknown option "-Background"

Cela ne fonctionne pas lorsque vous effectuez les opérations suivantes:

frame = Frame(root, background="white")

Ou:

frame = Frame(root)
frame.config(bg="white")

Je ne peux pas comprendre. Je publierais tout mon code source mais je ne veux pas qu'il soit exposé sur Internet, mais la création du cadre ressemble à ceci:

mail1 = Frame(self, relief=SUNKEN)
mail1.pack()
mail1.place(height=70, width=400, x=803, y=109)
mail1.config(Background="white")

J'ai essayé plusieurs options en essayant de modifier l'arrière-plan. Le cadre ressemble à un aperçu d'un e-mail pour une boîte de réception.

Au cas où cela serait nécessaire, voici la façon dont j'importe mes modules:

import tkinter, time, base64, imaplib, smtplib
from imaplib import *
from tkinter import *
from tkinter.ttk import *

Voici le traçage complet:

Traceback (most recent call last):
File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 457, in <module>
main()
File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 453, in main
app = Application(root) #start the application with root as the parent
File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 60, in __init__
self.initINBOX()
File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 317, in initINBOX
mail1.config(bg="white")
File "C:\Python33\lib\tkinter\__init__.py", line 1263, in configure
return self._configure('configure', cnf, kw)
File "C:\Python33\lib\tkinter\__init__.py", line 1254, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: unknown option "-bg"

Donne l'erreur suivante avec le code de la réponse:

  File "C:\Users\Wessel\Dropbox\Python\Main\Class Ginomail.py", line 317, in initINBOX
  mail1 = Frame(self, relief=SUNKEN, style='myframe')
  File "C:\Python33\lib\tkinter\ttk.py", line 733, in __init__
  Widget.__init__(self, master, "ttk::frame", kw)
  File "C:\Python33\lib\tkinter\ttk.py", line 553, in __init__
  tkinter.Widget.__init__(self, master, widgetname, kw=kw)
  File "C:\Python33\lib\tkinter\__init__.py", line 2075, in __init__
  (widgetName, self._w) + extra + self._options(cnf))
  _tkinter.TclError: Layout myframe not found

Résolu! Merci. C'est la barre de boîte de réception à droite, l'arrière-plan devait être blanc. Happy with the results, lets work on that inbox scrolling.

21
IPDGino

La racine du problème est que vous utilisez sans le savoir la classe Frame du package ttk plutôt que du package tkinter. Celui de ttk ne prend pas en charge l'option d'arrière-plan.

C'est la principale raison pour laquelle vous ne devriez pas faire d'importations globales - vous pouvez remplacer la définition des classes et des commandes.

Je recommande de faire des importations comme ceci:

import tkinter as tk
import ttk

Ensuite, vous préfixez les widgets avec tk ou ttk:

f1 = tk.Frame(..., bg=..., fg=...)
f2 = ttk.Frame(..., style=...)

Il devient alors instantanément évident quel widget vous utilisez, au détriment d'un peu plus de frappe. Si vous l'aviez fait, cette erreur dans votre code ne se serait jamais produite.

32
Bryan Oakley

Tu utilises ttk.Frame, bg option ne fonctionne pas pour elle. Vous devez créer un style et l'appliquer au cadre.

from tkinter import *
from tkinter.ttk import * 

root = Tk()

s = Style()
s.configure('My.TFrame', background='red')

mail1 = Frame(root, style='My.TFrame')
mail1.place(height=70, width=400, x=83, y=109)
mail1.config()
root.mainloop()
9
kalgasnik