Wie kann ich die Hintergrundfarbe eines Buttons ändern in IronPython in WPF?
Hallo,
Ich schreibe ein Programm in Visual Studio mit IronPython und WPF zur Erstellung einer Benutzeroberfläche.
Wie kann ich hier die Hintergrundfarbe eines Buttons ändern?
(nicht in XAML, möchte die Änderung des Hintergrunds in eine Funktion schreiben,
und BrushColor() geht auch nicht, hab ich auch schon getestet.)
Weiß jemand wie das geht?
self.button.Background = "..:" geht leider auch nicht
2 Antworten
Aber der Button ist doch innerhalb deines XAML-Codes definiert?
Erst wird der XAML-Code geladen:
xaml = XamlLoader('Window.xaml')
In diesem müsste der Button mit einem Namen ausgestattet worden sein:
<Button Content="Click me" x:Name="MyButton" />
und über diesen bekommst du folgend Zugriff im Python-Code:
xaml.MyButton.Background = Brushes.Blue
Jep, ich habe nicht erwähnt, wie der XamlLoader definiert wird:
class XamlLoader(object):
def __init__(self, xamlPath):
stream = File.OpenRead(xamlPath)
self.Root = XamlReader.Load(stream)
def __getattr__(self, item):
return self.Root.FindName(item)
Die XAML-Datei muss erst geparst werden. Danach kann man via FindName ihre Elemente suchen und diese verändern.
Dazu nochmal ein Beispiel:
import wpf
from System.IO import File
from System.Windows import Application, Window
from System.Windows.Markup import XamlReader
from System.Windows.Media import Brushes
# xaml loader ...
class MyWindow(Window):
def __init__(self):
xaml = XamlLoader('MyWindow.xaml')
xaml.MyButton.Background = Brushes.Blue
app = Application()
app.Run(xaml.Root)
window = MyWindow()
Vielen Dank für deine Hilfe, ich habe den Code nun so abgeändert:
import wpf
from System.IO import File
from System.Windows.Markup import XamlReader
from System.Windows.Media import Brushes
from System.Windows import Application, Window
class XamlLoader(object):
def __init__(self, xamlPath):
stream = File.OpenRead(xamlPath)
self.Root = XamlReader.Load(stream)
def __getattr__(self, item):
return self.Root.FindName(item)
class MyWindow(Window):
def __init__(self):
wpf.LoadComponent(self, 'WpfApplication2.xaml')
def m24_Click(self, sender, e):
xaml = XamlLoader('WpfApplication2.xaml')
xaml.m24.Background = Brushes.Blue
Wenn ich nun auf run drücke, passiert allerdings wieder nichts.. es kommt zwar keine Fehlermeldung, aber das WPF-Fenster öffnet sich auch nicht. WpfApplication2 ist der Name meiner Xaml-Datei
habs nun so und komm trotzdem nicht weiter.
import wpf
global data
from System.IO import File
from System.Windows.Markup import XamlReader
from System.Windows.Media import Brushes
from System.Windows import Application, Window
class XamlLoader(object):
def __init__(self, xamlPath):
stream = File.OpenRead(xamlPath)
self.Root = XamlReader.Load(stream)
def __getattr__(self, item):
return self.Root.FindName(item)
class MyWindow(Window):
def __init__(self):
wpf.LoadComponent(self, 'WpfApplication2.xaml')
xaml = XamlLoader('MyWindow.xaml')
xaml.m24.Background = Brushes.Blue
app = Application()
app.Run(xaml.Root)
Du legst noch immer keine Instanz von MyWindow an. Vergleiche mit meinem Beispiel.
sorry hab ich ganz unten noch stehen, bringt trotzdem nichts.
Was hat diese Zeile in dem Code zu suchen? Vor allem, wenn deine XAML-Datei offenkundig MyWindow.xaml heißt.
wpf.LoadComponent(self, 'WpfApplication2.xaml')
Dazu sollte dir sogar ein Fehler angezeigt werden.
als ich ein neues Ironpython projekt erstellt habe, und das wpf fenster entsprechend erstellt habe, entstand dies automatisch (selbsterzeugt)
und nein, dazu wird mir kein fehler angezeigt. wpfapplication2 heißt ja mein wpf fenster, wurde so automatisch erstellt.
Und wieso lädst du dann das XAML einer MyWindow.xaml, wenn dein Fenster doch ein anderes ist? 🤨
wie gesagt, der code wurde selbst erstellt und ich habe mein wpf fenster auch nicht abgeändert, wurde von visual studio alles automatisch so erstellt. aber hat doch nichts damit zu tun, dass der xaml loader etc. zum ändern der hintergrundfarbe des button nicht ghet..
Mein Beispiel und der XAML Loader funktionieren zu 100%. Alle Probleme, die du nun hast, kannst du nur selbst eingebaut haben.
button = Button(..., bg=Farbe)
button.pack()
Die Farbe musst du hexadezimal angeben, zum Beispiek ist schwarz "#000000"
Ist es das, was du meinst?
Das ist doch Tk, worauf du dich beziehst. Das ist ein anderes GUI-Toolkit als WPF.
habe ich auch shcon gemacht, funktioniert in ironpython nicht..
Funktioniert mit WPF in Ironpython 2.7 nicht....