Warum sieht ein Gui unter Linux nicht schön aus?(Anfänger)

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
aixwanderer
Beiträge: 7
Registriert: 09.05.2018 09:47

Warum sieht ein Gui unter Linux nicht schön aus?(Anfänger)

Beitrag von aixwanderer »

Ich habe ein GUI-Beispiel mit Purebaisc programmiert. Das Programm läuft unter Windows gut, die GUI sieht gut aus. Dann habe ich das gleichen Programm unter Linux Minte 19 Mate laufen gelassen. warum sieht die GUI nicht schön wie unter Windows aus. Außdem funktioniert #PB_TEXT_RIGHT und SetWindowColor(0, $EAD1B9) nicht mehr. Die Hntergrundfarbe vom Fenster kann nicht verändert werden.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 500, 400, "GUI Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowColor(0, $EAD1B9)
  sPF =StringGadget(1, 30, 20, 80, 22, "0", #PB_String_ReadOnly|#PB_String_Numeric|#PB_Text_Right)
  ButtonGadget(2, 200, 20, 80, 25, "Connect") 
  
EndIf


Repeat
  Event = WaitWindowEvent()
    
  Select Event
    Case #PB_Event_CloseWindow   
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
      EndSelect
   
  EndSelect
  
 ForEver
Gibt es noch andere Möglichkeit, die schöne GUI unter Linux zu bekommen? mit Gtk+ oder ...? Oder muss ich noch was unter Linux Mint 19 Mate installieren?
Bitte um die Hilfe!
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von #NULL »

Bei mir ist das Fenster blau, mit pb 5.62 x64, Ubuntu 16.04.
Du kannst mal in den Compiler Options bei Subsystem 'gtk2' eingeben (ohne Anführungszeichen) und gucken ob es anders aussieht, Default ist gtk3. Die Mindestgrößen für GUI Elemente sind mit gkt3 glaube ich anders bzw größer.
Auch überprüfen ob die checkinstall.sh irgendwas vermisst.

<edit>
#PB_Text_Right ist entweder Windows-Only oder sogar nur für TextGadget, jedenfalls ist es nicht zu StringGadget dokumentiert in meiner Linux PB Help.
Zuletzt geändert von #NULL am 12.07.2018 15:53, insgesamt 1-mal geändert.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von NicTheQuick »

Bei mir sieht es gut aus. Allerdings gibt es die Konstante #PB_Text_Right nicht für das StringGadget, die gilt nur für das TextGadget. Dass das unter Windows funktioniert, ist Zufall.
Bild
Bild
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von Shardik »

Wie NicTheQuick schon gesagt hat, darf die Konstante #PB_Text_Right nur für TextGadgets verwendet werden. Für StringGadgets gibt es in Windows die Konstante #ES_RIGHT, die zufällig denselben Wert 2 wie #PB_Text_Right hat. In Linux muss man dieses Problem anders lösen. Deshalb habe ich in meinem modifizierten Beispiel das Konstrukt CompilerSelect..CompilerEndSelect verwendet, damit abhängig vom verwendeten Betriebssystem die korrekte Lösung verwendet wird:

Code: Alles auswählen

OpenWindow(0, 0, 0, 500, 400, "GUI Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWindowColor(0, $EAD1B9)

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux
    ImportC ""
      gtk_entry_set_alignment(*Entry.GtkEntry, Alignment.F)
    EndImport

    StringGadget(1, 30, 20, 80, 22, "0", #PB_String_ReadOnly | #PB_String_Numeric)
    gtk_entry_set_alignment(GadgetID(1), 1)
  CompilerCase #PB_OS_Windows
    StringGadget(1, 30, 20, 80, 22, "0", #PB_String_ReadOnly | #PB_String_Numeric | #ES_RIGHT)
CompilerEndSelect

ButtonGadget(2, 200, 20, 80, 25, "Connect")

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Das Ändern der Hintergrundfarbe ist in Linux auf Grund des von PureBasic standardmäßig verwendeten GTK3-Frameworks heikel: der PureBasic-Befehl SetWindowColor() funktioniert abhängig von der verwendeten Linux-Distribution und der installierten Version von GTK3 teilweise nicht. Dies ist nicht die Schuld von PureBasic, sondern die der GTK3-Entwickler, die mehrfach die dazu benötigten internen Funktionen abgeändert haben. Der einfachste Weg zu einem funktionierenden SetWindowColor()-Befehl besteht darin, wie von #NULL vorgeschlagen in der Menüleiste auf Compiler > Compiler Options... zu klicken und im Reiter "Compiler Options" hinter "Library Subsystem:" den Eintrag "gtk2" (ohne Anführungszeichen) vorzunehmen, damit das ältere GTK2-Framework verwendet wird.

Wenn man unbedingt das GTK3-Framework benutzen will oder muss, kann man mit dem folgenden auf 16 verschiedenen Linux-Distributinen erfolgreich getesteten Programm die Hintergrundfarbe des Fensters abändern:

Code: Alles auswählen

; Durchgeführte Tests mit PB 5.62 x86:
; ------------------------------------
; + Bodhi Linux 4.5.0 mit Moksha 0.2.1 und GTK 3.18.9
; + Debian 8 mit Xfce und GTK 3.14.5
; + Elementary OS 0.2.1 'Luna' mit Pantheon und GTK 3.4.2
; + Fedora 27 mit Gnome 3 und GTK 3.22.26
; + Kubuntu 12.04 mit KDE 4 und GTK 3.4.2
; + Kubuntu 14.04 mit KDE 4 und GTK 3.10.8
; + Kubuntu 16.04 mit KDE 5.18.0 und GTK 3.18.9
; + Linux Mint 19 'Tara' mit Cinnamon und GTK 3.22.30
; + Lubuntu 14.04 mit LXDE und GTK 3.10.8
; + OpenSuSE 13.2 mit KDE 4.14.9 und GTK 3.14.15
; + PCLinuxOS 2014.05 MiniMe mit KDE 4 und GTK 3.14.14
; + Ubuntu 17.10 mit Gnome 3 unter Wayland (Unity Theme) und GTK 3.22.25
; + Ubuntu 17.10 mit Gnome 3 unter X.org (Unity Theme) und GTK 3.22.25
; + Ubuntu Budgie 17.10 mit Budgie 10.4 und GTK 3.22.25
; + Xubuntu 16.04 mit Xfce und GTK 3.18.9
; + Xubuntu 18.04 mit Xfce und GTK 3.22.30

EnableExplicit

CompilerIf Subsystem("gtk2")
  MessageRequester("Error",
    "Sorry, this code only works in GTK+ 3!") 
  End
CompilerElse
  ImportC ""
    gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length.I,
      *Error.GError)
    gtk_css_provider_new()
    gtk_style_context_add_provider(*StyleContext, *StyleProvider, Priority.I)
    gtk_widget_get_style_context(*Widget.GtkWidget)
  EndImport
  
  #GTK_STYLE_PROVIDER_PRIORITY_USER = 800

  Define ContainerWidget.I
  Define CSSProvider.I
  Define CSSData.S
  Define GTK3MinorVersion.I

  Procedure.I GetGTK3MinorVersion()
    Protected GTK3Version.S
    Protected GTK3MinorVersion.I
    Protected ProgramID.I

    ProgramID = RunProgram("pkg-config", "--modversion gtk+-3.0", "",
      #PB_Program_Open | #PB_Program_Read)

    If ProgramID
      GTK3Version = ReadProgramString(ProgramID)
      SetWindowTitle(0, "Current GTK version: " + GTK3Version)
      GTK3MinorVersion = Val(StringField(GTK3Version, 2, "."))
      CloseProgram(ProgramID)
    EndIf

    ProcedureReturn GTK3MinorVersion
  EndProcedure

  OpenWindow(0, 100, 100, 350, 230, "")

  GTK3MinorVersion = GetGTK3MinorVersion()

  If GTK3MinorVersion > 15
   CSSData = "window.background {background-color: yellow;}"
   ContainerWidget = WindowID(0)
  Else
   CSSData = "GtkLayout {background-color: yellow}"
   ContainerWidget = g_list_nth_data_(gtk_container_get_children_(WindowID(0)), 0)
   ContainerWidget = g_list_nth_data_(gtk_container_get_children_(ContainerWidget), 0)
  EndIf

  CSSProvider = gtk_css_provider_new()
  gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
  gtk_style_context_add_provider(gtk_widget_get_style_context(ContainerWidget),
    CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
  g_object_unref_(CSSProvider)

  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
CompilerEndIf
Zuletzt geändert von Shardik am 13.07.2018 11:36, insgesamt 1-mal geändert.
aixwanderer
Beiträge: 7
Registriert: 09.05.2018 09:47

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von aixwanderer »

Vielen, vielen Dank für die schnelle Antwortung und die detaillierte Erklärung! Es ist genau passiert, wie Ihr analysiert habt. Bei mir ist die Option der Compiler leer. #PB_Text_Right ist ein Zufall. Von Euch habe ich viel gelernt!
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von Shardik »

Ich habe mein Programm zur Änderung der Hintergrundfarbe von Linux-Fenstern mit GTK3-Framework so umgeschrieben, dass man es als Prozedur mit der gewünschten RGB-Farbe aufrufen kann:

Code: Alles auswählen

EnableExplicit

ImportC ""
  gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length.I,
    *Error.GError)
  gtk_css_provider_new()
  gtk_style_context_add_provider(*StyleContext, *StyleProvider, Priority.I)
  gtk_widget_get_style_context(*Widget.GtkWidget)
EndImport

#GTK_STYLE_PROVIDER_PRIORITY_USER = 800

Procedure.I GetGTK3MinorVersion()
  Protected GTK3Version.S
  Protected GTK3MinorVersion.I
  Protected ProgramID.I

  ProgramID = RunProgram("pkg-config", "--modversion gtk+-3.0", "",
    #PB_Program_Open | #PB_Program_Read)

  If ProgramID
    GTK3Version = ReadProgramString(ProgramID)
    GTK3MinorVersion = Val(StringField(GTK3Version, 2, "."))
    CloseProgram(ProgramID)
  EndIf

  ProcedureReturn GTK3MinorVersion
EndProcedure

Procedure SetWindowBackColor(WindowID.I, Color.I)
  Protected ContainerWidget.I
  Protected CSSProvider.I
  Protected CSSColor.S
  Protected CSSData.S
  Protected GTK3MinorVersion.I

  CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") +
    RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
  GTK3MinorVersion = GetGTK3MinorVersion()

  If GTK3MinorVersion > 15
    CSSData = "window.background {background-color: " + CSSColor + ";}"
    ContainerWidget = WindowID(WindowID)
  Else
    CSSData = "GtkLayout {background-color: " + CSSColor + ";}"
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(WindowID(WindowID)), 0)
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(ContainerWidget), 0)
  EndIf

  CSSProvider = gtk_css_provider_new()
  gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
  gtk_style_context_add_provider(gtk_widget_get_style_context(ContainerWidget),
    CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
  g_object_unref_(CSSProvider)
EndProcedure

OpenWindow(0, 100, 100, 350, 230, "Window with custom background color")
SetWindowBackColor(0, $EAD1B9)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
aixwanderer
Beiträge: 7
Registriert: 09.05.2018 09:47

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von aixwanderer »

Shardik, ich habe Deinen Code probiert. Das hat super funktioniert! :D :allright: Vielen Dank! noch eine Frage:

Ich habe ein GUI implementiert, aber wenn ich die Einstellung der Themen von Linux geändert habe, dann wurde einige Sachen des GUI-Programmes auch geändert, wie z.B. die Höhegröße des ButtonGadget wurde verkleinert, dann wurde die Beschriftung nicht vollständig angezeigt.

Gibt es eine Möglichkeit, die Veränderung zu verhindern, ob man die Themen von Linux geändert hätte?
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von Shardik »

Mit verschiedenen Themen unter Linux ist das leider so eine Sache. Ich benutze zum Testen grundsätzlich immer nur das voreingestellte Standard-Thema einer Distribution. Leider enthalten viele auswählbare Themen noch Fehler und sind teilweise nicht ganz ausgereift. Es gibt im englischen Unterforum "Bugs - Linux" eine ganze Reihe gemeldeter Fehler, die auf fehlerbehaftete Themen zurückzuführen sind und die Fred deshalb nicht beheben kann/will, weil dies Aufgabe der Entwickler des jeweiligen Themas ist. Und in Verbindung mit GTK3, das von seiner Philosophie eigentlich nicht zu PureBasic passt (siehe Blog-Eintrag "Enter GTK3" von Fred), dürften diese Fehler noch gehäuft auftreten. Wenn einem aber ein bestimmtes Thema unheimlich gut gefällt, dann sollte man den Entwicklern dieses Themas helfen, indem man versucht, Fehler in diesem Thema zu finden und Verbesserungsvorschläge/Fehlerbehebungen an die Entwickler senden...
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von mk-soft »

@Shardik,

vielen Dank für den Code und den Ansatz dieses auch für die Gadget umzusetzen.

Ich habe dein Code mit "gtk_style_context_remove_provider" erweitert, damit man auch mehrmals die Hintergrundfarbe ändern kann.

Code: Alles auswählen

EnableExplicit

ImportC ""
  gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length.I,
    *Error.GError)
  gtk_css_provider_new()
  gtk_style_context_add_provider(*StyleContext, *StyleProvider, Priority.I)
  gtk_style_context_remove_provider(*StyleContext, *StyleProvider)
  gtk_widget_get_style_context(*Widget.GtkWidget)
EndImport

#GTK_STYLE_PROVIDER_PRIORITY_USER = 800

Procedure.I GetGTK3MinorVersion()
  Protected GTK3Version.S
  Protected GTK3MinorVersion.I
  Protected ProgramID.I

  ProgramID = RunProgram("pkg-config", "--modversion gtk+-3.0", "",
    #PB_Program_Open | #PB_Program_Read)

  If ProgramID
    GTK3Version = ReadProgramString(ProgramID)
    GTK3MinorVersion = Val(StringField(GTK3Version, 2, "."))
    CloseProgram(ProgramID)
  EndIf

  ProcedureReturn GTK3MinorVersion
EndProcedure

Procedure SetWindowBackColor(WindowID.I, Color.I)
  Static NewMap CSSProviderMap()
  Protected ContainerWidget.I
  Protected CSSProvider.I
  Protected CSSContext.I
  Protected CSSColor.S
  Protected CSSData.S
  Protected GTK3MinorVersion.I

  CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") +
    RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
  GTK3MinorVersion = GetGTK3MinorVersion()

  If GTK3MinorVersion > 15
    CSSData = "window.background {background-color: " + CSSColor + ";}"
    ContainerWidget = WindowID(WindowID)
  Else
    CSSData = "GtkLayout {background-color: " + CSSColor + ";}"
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(WindowID(WindowID)), 0)
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(ContainerWidget), 0)
  EndIf
  CSSProvider = gtk_css_provider_new()
  CSSContext = gtk_widget_get_style_context(ContainerWidget)
  If FindMapElement(CSSProviderMap(), Hex(WindowID))
    gtk_style_context_remove_provider(CSSContext, CSSProviderMap())
  EndIf
  CSSProviderMap(Hex(WindowID)) = CSSProvider 
  gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
  gtk_style_context_add_provider(CSSContext,
    CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
  g_object_unref_(CSSProvider)
EndProcedure

OpenWindow(0, 100, 100, 350, 230, "Window with custom background color")
SetWindowBackColor(0, $EAD1B9)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Beitrag von Sven »

aixwanderer hat geschrieben:warum sieht die GUI nicht schön wie unter Windows aus.
Das muss so! Die Linuxer wollen das so.

Ich ärger mich auch regelmäßig drüber, dass für Linux die Buttons mindestens doppelt so hoch sein müssen, und man doppelt soviel Breite für den gleichen Text einplanen muss, damit er nicht abgeschnitten wird. Und so Kram wie eingefärbte Gadgets fang ich gar nicht mehr an. Dann noch so Feinheiten im Design wie: Editierbare Comboboxen sind eckig, nicht editierbare haben runde Ecken - und eine andere Höhe...

Für Linux eine ansprechende Oberfläche erstellen ist sinnlos, mit dem nächsten OS-Update kann die schon wieder anders aussehen. Oder Du machst alles Owner-Draw.
Antworten