Wie kann ich die Hintergrundfarbe eines Buttons ändern in IronPython in WPF?

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
Nikolai1997 
Fragesteller
 18.06.2020, 15:16

Funktioniert mit WPF in Ironpython 2.7 nicht....

0
regex9  18.06.2020, 16:33
@Nikolai1997

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()
0
Nikolai1997 
Fragesteller
 19.06.2020, 07:40
@regex9

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

0
Nikolai1997 
Fragesteller
 19.06.2020, 11:15
@regex9

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)
0
regex9  19.06.2020, 11:56
@Nikolai1997

Du legst noch immer keine Instanz von MyWindow an. Vergleiche mit meinem Beispiel.

0
Nikolai1997 
Fragesteller
 19.06.2020, 12:28
@regex9

sorry hab ich ganz unten noch stehen, bringt trotzdem nichts.

0
regex9  19.06.2020, 13:01
@Nikolai1997

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.

0
Nikolai1997 
Fragesteller
 19.06.2020, 14:01
@regex9

als ich ein neues Ironpython projekt erstellt habe, und das wpf fenster entsprechend erstellt habe, entstand dies automatisch (selbsterzeugt)

0
Nikolai1997 
Fragesteller
 22.06.2020, 07:39
@regex9

und nein, dazu wird mir kein fehler angezeigt. wpfapplication2 heißt ja mein wpf fenster, wurde so automatisch erstellt.

0
regex9  22.06.2020, 10:26
@Nikolai1997

Und wieso lädst du dann das XAML einer MyWindow.xaml, wenn dein Fenster doch ein anderes ist? 🤨

0
Nikolai1997 
Fragesteller
 22.06.2020, 10:31
@regex9

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..

0
regex9  22.06.2020, 13:50
@Nikolai1997

Mein Beispiel und der XAML Loader funktionieren zu 100%. Alle Probleme, die du nun hast, kannst du nur selbst eingebaut haben.

0
button = Button(..., bg=Farbe)
button.pack()

Die Farbe musst du hexadezimal angeben, zum Beispiek ist schwarz "#000000"

Ist es das, was du meinst?

Nikolai1997 
Fragesteller
 18.06.2020, 15:12

habe ich auch shcon gemacht, funktioniert in ironpython nicht..

0
regex9  18.06.2020, 15:14

Das ist doch Tk, worauf du dich beziehst. Das ist ein anderes GUI-Toolkit als WPF.

0