Ξεκινώντας
July 18, 2026 · View on GitHub
Θέλετε να δημιουργήσετε μια εφαρμογή για υπολογιστές στο Go. Ήρθατε στο σωστό μέρος
Προαπαιτούμενα
Μεταβείτε στο 1.22 ή νεότερο. Ελέγξτε με:
go version
Εάν είστε σε Linux, χρειάζεστε επίσης τρία πακέτα συστήματος. χρήστες macOS και Windows μπορεί να το παραλείψει και να νιώθει αυτάρεσκα:
sudo apt install libwayland-dev libxkbcommon-dev libvulkan-dev
Εγκατάσταση
Στον κατάλογο του έργου σας:
go get github.com/CzaxStudio/proton
go mod tidy
Το βήμα «go mod tidy» είναι σημαντικό — τραβάει τις μεταβατικές εξαρτήσεις του Gio και τα γράφει στο «go.sum». Παραλείψτε το και θα δείτε παντού κόκκινα σκουπίδια.
Το πρώτο σας παράθυρο
package main
import "github.com/CzaxStudio/proton"
func main() {
a := proton.New("hello")
a.Window("Hello", 480, 320, func(ctx proton.Context) {
proton.H3(ctx, "Hello from Proton!") // ⓘ You can change proton.H3 to any size you want
})
a.Run()
}
go run .
Εμφανίζεται ένα παράθυρο. Αυτή είναι μια ολοκληρωμένη, λειτουργική εφαρμογή GUI σε 9 γραμμές. Χωρίς XML, χωρίς «εφαρμογές Runnable», χωρίς πλαίσιο ένεσης εξάρτησης, χωρίς πακέτο ιστού.
Προσθήκη κατάστασης
Τα γραφικά στοιχεία που κάνουν κάτι — κουμπιά, εισαγωγή κειμένου, πλαίσια ελέγχου — χρειάζονται μια κατάσταση πεδίο στη δική σας κατασκευή. Δηλώστε τα μια φορά, περάστε δείκτες στα γραφικά στοιχεία.
package main
import (
"fmt"
"github.com/CzaxStudio/proton"
)
type UI struct {
name proton.Editor
btn proton.Clickable
}
func main() {
u := &UI{}
a := proton.New("greeter")
a.Window("Greeter", 400, 240, func(ctx proton.Context) {
proton.Input(ctx, &u.name, "Your name")
proton.Gap(ctx, 8)
proton.Pad(ctx, 4, func(ctx proton.Context) {
if proton.Button(ctx, &u.btn, "Say hello") {
fmt.Println("Hello,", u.name.Text())
}
})
})
a.Run()
}
Η συνάρτηση σχεδίασης εκτελεί κάθε καρέ. Το "Button" επιστρέφει "true" στο πλαίσιο του γίνεται κλικ. Το μπλοκ "if" εκτελείται, εκτυπώνει το όνομα και αυτό είναι.
Οι τύποι κατάστασης
Δηλώστε τα στη δομή της διεπαφής χρήστη. Είναι όλα έτοιμα για μηδενική τιμή — χωρίς κατασκευαστές.
type UI struct {
btn proton.Clickable // Button, OutlineButton, Tappable, Link
name proton.Editor // Input, TextArea
checked proton.Bool // Checkbox, Toggle
choice proton.Enum // RadioButton group
vol proton.Float // Slider
scroll proton.Scrollable // List, HList, Scroll, TextView, LogView
}
Ένα πεδίο ανά γραφικό στοιχείο. Μην μοιράζεστε ένα «με δυνατότητα κλικ» μεταξύ δύο κουμπιών — θα το κάνουν Και οι δύο ενεργοποιούνται με το ίδιο κλικ, το οποίο σχεδόν ποτέ δεν είναι αυτό που θέλετε.
Πώς λειτουργεί η διάταξη
Χωρίς περιτυλίγματα διάταξης, τα γραφικά στοιχεία στοιβάζονται κάθετα από πάνω προς τα κάτω. «Κενό». προσθέτει χώρο μεταξύ τους.
proton.H4(ctx, "Settings")
proton.Gap(ctx, 12)
proton.Label(ctx, "Adjust your preferences below.")
proton.Gap(ctx, 16)
proton.Divider(ctx)
proton.Gap(ctx, 16)
proton.Toggle(ctx, &u.darkMode, "Dark mode")
Για διάταξη δίπλα-δίπλα, χρησιμοποιήστε τη «Σειρά». Για περισσότερο έλεγχο, ανατρέξτε στο 04-layout.md.
Κουμπιά Χρειάζονται περιτύλιγμα διάταξης
Τα κουμπιά (και άλλα διαδραστικά γραφικά στοιχεία) πρέπει να βρίσκονται μέσα σε ένα βοηθό διάταξης κλικ για να εγγραφείτε σωστά. Αυτό είναι ένα θέμα Gio — το πάσο της διάταξης είναι αυτό καθορίζει τις περιοχές χτυπήματος στην οθόνη.
// correct — button is inside Pad
proton.Pad(ctx, 8, func(ctx proton.Context) {
if proton.Button(ctx, &u.btn, "Save") {
save()
}
})
// also correct — button is inside Row
proton.Row(ctx,
func(ctx proton.Context) {
if proton.Button(ctx, &u.btn, "Save") {
save()
}
},
)
Εάν βάλετε ένα κουμπί στο πολύ ανώτερο επίπεδο της κλήρωσης, λειτουργεί χωρίς κανένα περιτύλιγμα, θα τραβήξει αλλά δεν θα ανταποκρίνεται στα κλικ. Το "Pad(ctx, 0, ...)" είναι το ελάχιστο περιτύλιγμα εάν θέλετε μηδενική οπτική επένδυση.
Θέμα
a := proton.New("myapp")
a.ApplyPalette(proton.NordPalette)
a.Window("App", 800, 600, draw)
a.Run()
Έχουν ενσωματωθεί 46 παλέτες. Δείτε το 07-theming.md για όλες και για να φτιάξετε το δικό σας με εξαγωνικούς χρωματικούς κωδικούς.
Πολλά παράθυρα
a := proton.New("app")
a.Window("Main", 800, 600, drawMain)
a.Window("Settings", 400, 300, drawSettings)
a.Run() // opens both
Όλα τα παράθυρα μοιράζονται την ίδια «*Εφαρμογή». Η διαδικασία παραμένει ζωντανή μέχρι όλα τα παράθυρα είναι κλειστά.
Επόμενα βήματα
- 01-text.md — γραφικά στοιχεία κειμένου
- 02-buttons.md — κουμπιά και περιοχές με δυνατότητα κλικ
- 03-inputs.md — πεδία κειμένου, εναλλαγές, ρυθμιστικά
- 04-layout.md — τακτοποίηση πραγμάτων στην οθόνη
- 09-examples.md — πλήρη προγράμματα εργασίας προς αντιγραφή