473,385 Members | 1,392 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

{SOLVED} Simple Tkinter question (inline code to class using list)

Hi all,

I'm trying to write a GUI that will put up multiple widgets in
succession, all using the same class. Here's the class for the widget:

class TwoChoice:
def __init__(self, master):

frame = Frame(master)
frame.pack()
m = Label(root, text= maentry)
m.pack()
n = Label(root, text= fave)
n.pack()

self.button = Button(frame, text=home_team, command=
self.comm_1)
self.button.pack(side=LEFT)

self.hi_there = Button(frame, text=vis_team,
command=self.comm_2)
self.hi_there.pack(side=LEFT)

def comm_1(self):
print home_team
root.quit()

def comm_2(self):
print vis_team
root.quit()

I call it by

root = Tk()
gui= TwoChoice(root)
root.mainloop()

The problem is that when I call it again with new values for the variables, it prints both the old values and the new values. Then, the third time I call it it prints all three values, etc. How do I get it to only print the current values of the variables? I hope this is clear, what I mean is that the second widget will appear with 4 buttons instead of 2, and I don't want that to happen.

Thanks,
Greg
Nov 8 '06 #1
10 1803
bartonc
6,596 Expert 4TB
Hey, Greg, I'll be able to get to this in a while. In the meanwhile, it would be very helpful if you would post back using [code] tags around your code. Thanks.
Nov 8 '06 #2
bartonc
6,596 Expert 4TB
This sounds like some problem with the "scope" of the variables.
For example it don't see
home_team and vis_team
in your class, nor how you are "calling" with new values.
Go ahead and post all the code using [code] tags, and I'll help you straighten things out.
Nov 9 '06 #3
bartonc
6,596 Expert 4TB
Your post should look something like the following. It should run or produce any error that you are getting. This way somebody (probably me) can copy it, run it, fix it and repost it. Thanks
Expand|Select|Wrap|Line Numbers
  1. from Tkinter import *
  2. home_team = "Mets"
  3. vis_team = "STL"
  4. class TwoChoice:
  5.     def __init__(self, master):
  6.         frame = Frame(master)
  7.         frame.pack()
  8.         m = Label(root, text= "whatever")
  9.         m.pack()
  10.         n = Label(root, text= "whoever")
  11.         n.pack()
  12.         self.button = Button(frame, text=home_team, command=
  13.                              self.comm_1)
  14.         self.button.pack(side=LEFT)
  15.         self.hi_there = Button(frame, text=vis_team,
  16.                              command=self.comm_2)
  17.         self.hi_there.pack(side=LEFT)
  18.     def comm_1(self):
  19.         print home_team
  20. #        root.quit()
  21.     def comm_2(self):
  22.         print vis_team
  23. #        root.quit()
  24. # I call it by
  25. root = Tk()
  26. gui= TwoChoice(root)
  27. root.mainloop() 
  28.  
You should be able to preview and edit your post 'til it look right. Instructions for using code tags can be found in gray background writing while you are creating you post, in the posting guidelines to your right while you are creating you post or in the sticky at the top of this forum.
Nov 9 '06 #4
Thanks for your replies and help. I'm away from home right now and don't have access to my computer, but tomorrow I will post it using the code tags as you mention.

Greg
Nov 9 '06 #5
bartonc
6,596 Expert 4TB
Thanks for your replies and help. I'm away from home right now and don't have access to my computer, but tomorrow I will post it using the code tags as you mention.

Greg
Thanks for the update!
Nov 9 '06 #6
Here is my program:

Expand|Select|Wrap|Line Numbers
  1. import urllib2
  2. import string
  3. import os
  4. # from greg import * 
  5. import re
  6. import Tkinter
  7. from Tkinter import *
  8.  
  9. maentry=''
  10. fave=''
  11. home_team=''
  12. vis_team=''
  13. k=0
  14.  
  15. # This function reads line number lineno in a file
  16. def readline(lineno, filename):
  17.      file=open(filename, "r")
  18.      y=1
  19.      while y<lineno:
  20.           file.readline()
  21.           y=y+1
  22.      content=file.readline()
  23.      return content
  24.  
  25. # This function counts the number of lines in a file
  26. def countlines(filename):
  27.      file=open(filename, "r")
  28.      y=0
  29.      while 1:
  30.           if not file.readline(): break
  31.           y=y+1
  32.      return y 
  33.  
  34. # Creates a widget with two choices on buttons.
  35. class TwoChoice:
  36.     def __init__(self, master):
  37.  
  38.     frame = Frame(master)
  39.         frame.pack()
  40.         m = Label(root, text= maentry)
  41.         m.pack()
  42.         n = Label(root, text= fave)
  43.         n.pack()
  44.         self.button = Button(frame, text=home_team, command= self.comm_1)
  45.         self.button.pack(side=LEFT)
  46.  
  47.         self.hi_there = Button(frame, text=vis_team, command=self.comm_2)
  48.         self.hi_there.pack(side=LEFT)
  49.  
  50.     def comm_1(self):
  51.         print home_team
  52.         root.quit()
  53.  
  54.     def comm_2(self):
  55.         print vis_team
  56.         root.quit()
  57.  
  58.  
  59.  
  60. # The following is a function that gets the spread from a line containing it.
  61. # It features some pretty damn inelegant code, but is simple and
  62. # works. 
  63. def get_spread(line):
  64.     a = ''
  65.     w=1
  66.     while w<10:
  67.         if line[w]== '-':
  68.             a = line[w+1]
  69.             if line[w+2] == '<': break
  70.             else: a = a + line[w+2]
  71.             if line[w+3] == '<': break
  72.                         else: a = a + line[w+3]
  73.             if line[w+4] == '<': break
  74.                         else: a = a + line[w+4]
  75.         w+=1    
  76.     return a
  77.  
  78. # This function looks at the file for any team from the list, then looks two
  79. # lines further for its opponent. Then switches home and away if necessary.
  80. # Then writes the matchup to a file. The global line allows the function
  81. # to change variables globally. The break lines are necessary, and probably 
  82. # just a good idea in general, b/c once you find a team that matches you
  83. # don't want to look for any more, or things can get screwed up. 
  84. def findteams():
  85.     global y, k, home_team, vis_team, fave, maentry 
  86.     line = readline(y, 'temp.txt')
  87.     for team in teams:
  88.         if string.find(line,team) >= 0:
  89.             home_team = team
  90.             y+=1
  91.             line = readline(y, 'temp.txt')
  92.             spread= get_spread(line)
  93.             fave = home_team + ' favored by ' + spread+ '\n'
  94.             y+=1
  95.             line = readline(y, 'temp.txt')
  96.             for team2 in teams:
  97.                 if string.find(line,team2) >= 0:
  98.                                 vis_team = team2
  99.                     break
  100.             if string.find(line, 'At') >= 0:
  101.                 home_team, vis_team = vis_team, home_team
  102.             maentry=teams[vis_team]+" at "+teams[home_team]+'\n'
  103.             #email = open('maemail.txt','a')
  104.             #email.write(maentry + fave)
  105.             k=1
  106.             break
  107.  
  108. teams = {'Baltimore': 'Baltimore Ravens', 'Buffalo': 'Buffalo Bills',
  109. 'Cincinnati': 'Cincinnati Bengals', 'Cleveland': 'Cleveland Browns',
  110. 'Denver': 'Denver Broncos', 'Houston': 'Houston Texans', 
  111. 'Indianapolis': 'Indianapolis Colts', 'Jacksonville': 'Jacksonville Jaguars',
  112. 'Kansas City': 'Kansas City Chiefs', 'Miami': 'Miami Dolphins',
  113. 'New England': 'New England Patriots','Jets': 'New York Jets',
  114. 'Oakland': 'Oakland Raiders','Pittsburgh': 'Pittsburgh Steelers',
  115. 'San Diego': 'San Diego Chargers','Tennessee': 'Tennessee Titans',
  116. 'Arizona': 'Arizona Cardinals','Atlanta': 'Atlanta Falcons',
  117. 'Carolina': 'Carolina Panthers', 'Chicago': 'Chicago Bears',
  118. 'Dallas': 'Dallas Cowboys', 'Detroit': 'Detroit Lions',
  119. 'Green Bay': 'Green Bay Packers','Minnesota': 'Minnesota Vikings',
  120. 'New Orleans': 'New Orleans Saints', 'Giants': 'New York Giants',
  121. 'Philadelphia': 'Philadelphia Eagles', 'St. Louis': 'St. Louis Rams',
  122. 'San Francisco': 'San Francisco 49ers', 'Seattle': 'Seattle Seahawks',
  123. 'Tampa Bay': 'Tampa Bay Buccaneers', 'Washington': 'Washington Redskins'}
  124.  
  125.  
  126. # The following opens a webpage and saves the source as temp.txt
  127. page = urllib2.urlopen('http://www.footballlocks.com/nfl_point_spreads.shtml').read()
  128.  
  129.  
  130. tpage = open('temp.txt','w')
  131. tpage.write(page)
  132. tpage.close()
  133.  
  134. M= countlines('temp.txt')
  135.  
  136. #email = open('maemail.txt','w')
  137.  
  138. root = Tk()
  139.  
  140. y=1
  141. while y <= M:
  142.     findteams()
  143.     if k==1:
  144.         gui= TwoChoice(root)
  145.         root.mainloop()
  146.     y += 1
  147.     k=0
  148.  
  149.  
  150. # The following sends an email to me with all the info. 
  151.  
  152. #SENDMAIL = "/usr/sbin/sendmail" # sendmail location
  153. #p = os.popen("%s -t" % SENDMAIL, "w")
  154. #p.write("To: g@nospam.com\n")
  155. ##p.write("From: g@spam.com\n")
  156. #p.write("Subject: NFL picks\n")
  157. #p.write("\n") # blank line separating headers from body
  158.  
  159. #p.write("Here are the football games for the week.\n")
  160.  
  161. #p.write("\n")
  162.  
  163. #text = open('maemail.txt','r')
  164.  
  165. #for line in text:
  166. #        p.write(line+"\n")
  167.  
  168. #p.close()
  169.  
  170. # Clean up. This runs the bash command rm.
  171. #os.system('rm maemail.txt temp.txt')
  172.  
What this program is supposed to do is go to a website and find all the football games for the week, as well as the spreads, and then put each game up one at a time on a Tkinter widget and ask me which one I think will win. I click on who I think, and then it sends me an email with my picks. The email part at the end I haven't finished, but that I know how to do. I think you will see the problem if you try to run it, the way each widget is just added to the one before.

I'm grateful for the help I'm getting. If you want to give any other advice on any other aspects of the program I'd be happy to hear it, b/c I'm trying to learn to program on my own and don't have a ton of experience.
Nov 12 '06 #7
bartonc
6,596 Expert 4TB
This is a good one. I'll work on it a bit and get back to you.
Nov 12 '06 #8
bartonc
6,596 Expert 4TB
This is a good one. I'll work on it a bit and get back to you.
Here is something to sink your teeth into. It works, but is not well tested.
It is (I feel) well structured so that you should be able to fix it easily.
I tried to keep it as much like the original as posible, but renamed a couple of variables. Regarding TKinter: pack() is the least used of the geometry managers. If you don't have a good Tkinter book, I can point you to some early docs that I learned from.
Expand|Select|Wrap|Line Numbers
  1.  
  2. import urllib2
  3. import string
  4. import os
  5. # from greg import * 
  6. import re
  7. import Tkinter
  8. from Tkinter import *
  9. # Global variables limit your ability to reuse your work
  10. # so they are discouraged. Let's see if we can get them
  11. # into your class
  12. maentry=''
  13. fave=''
  14. home_team=''
  15. vis_team=''
  16. k=0 
  17. # This is OK, but may move to fuction for better separation of data and code.
  18. teams = {'Baltimore': 'Baltimore Ravens', 'Buffalo': 'Buffalo Bills',
  19. 'Cincinnati': 'Cincinnati Bengals', 'Cleveland': 'Cleveland Browns',
  20. 'Denver': 'Denver Broncos', 'Houston': 'Houston Texans', 
  21. 'Indianapolis': 'Indianapolis Colts', 'Jacksonville': 'Jacksonville Jaguars',
  22. 'Kansas City': 'Kansas City Chiefs', 'Miami': 'Miami Dolphins',
  23. 'New England': 'New England Patriots','Jets': 'New York Jets',
  24. 'Oakland': 'Oakland Raiders','Pittsburgh': 'Pittsburgh Steelers',
  25. 'San Diego': 'San Diego Chargers','Tennessee': 'Tennessee Titans',
  26. 'Arizona': 'Arizona Cardinals','Atlanta': 'Atlanta Falcons',
  27. 'Carolina': 'Carolina Panthers', 'Chicago': 'Chicago Bears',
  28. 'Dallas': 'Dallas Cowboys', 'Detroit': 'Detroit Lions',
  29. 'Green Bay': 'Green Bay Packers','Minnesota': 'Minnesota Vikings',
  30. 'New Orleans': 'New Orleans Saints', 'Giants': 'New York Giants',
  31. 'Philadelphia': 'Philadelphia Eagles', 'St. Louis': 'St. Louis Rams',
  32. 'San Francisco': 'San Francisco 49ers', 'Seattle': 'Seattle Seahawks',
  33. 'Tampa Bay': 'Tampa Bay Buccaneers', 'Washington': 'Washington Redskins'}
  34. # Module scope "helper functions" are an OK practice (you'll see this often)
  35. # This function reads line number lineno in a file
  36. # "file" is a key word in python; better to use tmpFile or something
  37. # files left open are handled by garbage collection, but better to tmpFile.close()
  38. # Keep all the lines in a list for faster operation anyway
  39. def readline(lineno, filename):
  40.      file=open(filename, "r")
  41.      y=1
  42.      while y<lineno:
  43.          file.readline()
  44.          y=y+1
  45.      content=file.readline()
  46.      return content
  47. # This function counts the number of lines in a file
  48. def countlines(filename):
  49.      file=open(filename, "r")
  50.      y=0
  51.      while 1:
  52.          if not file.readline(): break
  53.          y=y+1
  54.      return y
  55.  
  56. # Everything that a frame knows how to do should be a
  57. # method of the frame. To promote reusability, subclass Frame
  58. # Creates a widget with two choices on buttons. Handle all button clicks.
  59. # store results. Application can ask how many results we've got and act on that.
  60. # For now, we'll just quit the app at the end of the file.
  61. # The current choices will be reflected on the widgets (not new widgets).
  62. class TwoChoice(Frame): # This way a larger app can just pack this class.
  63.     def __init__(self, master):
  64.         Frame.__init__(self, master)
  65.         self.master = master
  66.         self.pickList = [] # Store picks here
  67.         self.lineNum = 1    # By moving "globals" here, you make this reusable
  68.         self.lineList = self.GetPageAsList() # Use descriptive variable names
  69.         self.nLines = len(self.lineList)    # len() is really fast because objects
  70.                                             # know what their size is
  71.         home_team, vis_team, spread = self.FindTeams()
  72.         self.CreateWidgets(home_team, vis_team, spread)    # This actually simplifies things
  73.     def CreateWidgets(self, home_team, vis_team, spread):
  74.         # Widgets make good storage for current values
  75.         maentry, fave = self.ConcatLabels(home_team, vis_team, spread)
  76.         self.gameLabel = m = Label(root, text=maentry)
  77.         m.pack()
  78.         self.oddsLabel = n = Label(root, text=fave)
  79.         n.pack()
  80.         self.homeButton = Button(self, text=home_team, command=self.OnHomeButton)
  81.         self.homeButton.pack(side=LEFT)
  82.         self.visButton = Button(self, text=vis_team, command=self.OnVisButton)
  83.         self.visButton.pack(side=LEFT)
  84.     def ChangeWidgets(self):
  85.         home_team, vis_team, spread = self.FindTeams()
  86.         maentry, fave = self.ConcatLabels(home_team, vis_team, spread)
  87.         self.homeButton.config(text=home_team)
  88.         self.visButton.config(text=vis_team)
  89.         self.gameLabel.config(text=maentry)
  90.         self.oddsLabel.config(text=fave)
  91.  
  92.     def ConcatLabels(self, home_team, vis_team, spread):
  93.         maentry = teams[vis_team]+" at "+teams[home_team]+'\n'
  94.         fave = home_team + ' favored by ' + spread+ '\n'
  95.         return maentry, fave
  96.     def OnHomeButton(self):
  97.         teamName = self.homeButton['text']
  98.         self.pickList.append(teamName)
  99.         print teamName
  100.         self.ChangeWidgets()
  101. #        root.quit()
  102.     def OnVisButton(self):
  103.         teamName = self.visButton['text']
  104.         self.pickList.append(teamName)
  105.         print teamName
  106.         self.ChangeWidgets()
  107. #        root.quit()
  108.  
  109.     # The following is a function that gets the spread from a line containing it.
  110.     # It features some pretty damn inelegant code, but is simple and
  111.     # works. [ could use line.find('-') instead of loop ]
  112.     def get_spread(self, line):
  113.         a = ''
  114.         w=1
  115.         while w<10:
  116.             if line[w]== '-':
  117.                 a = line[w+1]
  118.                 if line[w+2] == '<': break
  119.                 else: a = a + line[w+2]
  120.                 if line[w+3] == '<': break
  121.                 else: a = a + line[w+3]
  122.                 if line[w+4] == '<': break
  123.                 else: a = a + line[w+4]
  124.             w+=1 
  125.         return a
  126.     # This function looks at the file for any team from the list, then looks two
  127.     # lines further for its opponent. Then switches home and away if necessary.
  128.     # Then writes the matchup to a file. The global line allows the function
  129.     # to change variables globally. The break lines are necessary, and probably 
  130.     # just a good idea in general, b/c once you find a team that matches you
  131.     # don't want to look for any more, or things can get screwed up. 
  132.     def FindTeams(self):
  133.         found = 0
  134.         y = self.lineNum
  135.         while (y < self.nLines) and not found:
  136.             line = self.lineList[y]
  137.             for team in teams:
  138.                 if string.find(line, team) >= 0:
  139.                     found = 1
  140.                     home_team = team
  141.                     y += 1
  142.                     line = self.lineList[y]
  143.                     spread = self.get_spread(line)
  144.                     y += 1
  145.                     line = self.lineList[y]
  146.                     for team2 in teams:
  147.                         if string.find(line, team2) >= 0:
  148.                             vis_team = team2
  149.                             break
  150.                     if string.find(line, 'At') >= 0:
  151.                         home_team, vis_team = vis_team, home_team
  152.                     break
  153.             y += 1
  154.         self.lineNum = y
  155.         return home_team, vis_team, spread
  156.  
  157.     def GetPageAsList(self):
  158.         # Maybe make another Frame to pick the site if errors occure
  159.         # Since the description fits in a sentance, the code fits in a fuction (at least):
  160.         # The following opens a webpage and saves the source as temp.txt
  161.         page = urllib2.urlopen('http://www.footballlocks.com/nfl_point_spreads.shtml').read()
  162.         # Python has a tempfile object which creates its own temporary name + other handy stuff
  163.         # Another way to make a block of text into an iterable is page.split('\n')
  164.         # Test to see which is faster
  165.         # Maybe strip off unused lines to speed things up a bit
  166.         tpage = open('temp.txt','w')
  167.         tpage.write(page)
  168.         tpage.close()
  169.         tpage = open('temp.txt')
  170.         lineList = tpage.readlines()
  171.         tpage.close()
  172.         return lineList
  173.     def SendEmail(self):
  174.         pass
  175.         #email = open('maemail.txt','w')
  176.  
  177. if __name__ == "__main__": # This allows a bigger app to import this module
  178.     root = Tk()
  179.     mainFrame = TwoChoice(root)
  180.     mainFrame.pack()
  181.     root.mainloop()
  182. ##M= countlines('temp.txt')
  183. ##This all gets handled by button event handlers
  184. ##y=1
  185. ##while y <= M:
  186. ## findteams()
  187. ## if k==1:
  188. ## gui= TwoChoice(root)
  189. ## root.mainloop()
  190. ## y += 1
  191. ## k=0
  192.  
  193. # The following sends an email to me with all the info. 
  194. #SENDMAIL = "/usr/sbin/sendmail" # sendmail location
  195. #p = os.popen("%s -t" % SENDMAIL, "w")
  196. #p.write("To: g@nospam.com\n")
  197. ##p.write("From: g@spam.com\n")
  198. #p.write("Subject: NFL picks\n")
  199. #p.write("\n") # blank line separating headers from body
  200. #p.write("Here are the football games for the week.\n")
  201. #p.write("\n")
  202. #text = open('maemail.txt','r')
  203. #for line in text:
  204. #        p.write(line+"\n")
  205. #p.close()
  206. # Clean up. This runs the bash command rm.
  207. #os.system('rm maemail.txt temp.txt')
  208.  
  209.  
Nov 13 '06 #9
Wow! Thanks for all of this. I tested it and it works, and is clearly much better than what I had. I don't understand it all, but hopefully will soon with a bit of work. Thanks a million, I can tell that this will be very valuable forn me to learn from.
Nov 14 '06 #10
bartonc
6,596 Expert 4TB
Wow! Thanks for all of this. I tested it and it works, and is clearly much better than what I had. I don't understand it all, but hopefully will soon with a bit of work. Thanks a million, I can tell that this will be very valuable forn me to learn from.
You are very welcome! That's what we are here for. Keep posting,
Barton
Nov 14 '06 #11

Sign in to post your reply or Sign up for a free account.

Similar topics

2
by: Matthew Wilson | last post by:
Hi- I've been goofing off with some basic recursive landscape generating stuff, drawing the output to a tk window. You can run the program like so: from pts import * >>> draw(5) #will...
2
by: Stewart Midwinter | last post by:
I would like to link the contents of three OptionMenu lists. When I select an item from the first list (call it continents), the contents of the 2nd list (call it countries) would update. And in...
7
by: SeeBelow | last post by:
Do many people think that wxPython should replace Tkinter? Is this likely to happen? I ask because I have just started learning Tkinter, and I wonder if I should abandon it in favor of...
7
by: Harlin Seritt | last post by:
I was looking at the Tcl/Tk sourceforge page and found that there were a couple of new widgets being produced for Tcl 8.5. Does anyone know if there are any Tkinter wrappers somewhere? thanks, ...
0
by: Kevin F | last post by:
I've been trying to implement this script, it polls an IMAP inbox for unread messages and displays the sender and subject in a scrollable window using Tkinter. However, when I try to change the...
0
by: Kevin F | last post by:
Sorry to repost... but 4am didn't get much responses. I've been trying to implement this script, it polls an IMAP inbox for unread messages and displays the sender and subject in a scrollable...
1
by: www.web20developers.com | last post by:
http://www.web20developers.com http://www.web20developers.com/index.php?option=com_content&task=view... Ajallerix : AJAX, simple, fast Web image gallery demo ; at Novell AJAX -...
0
by: xqxq | last post by:
First of all, I have to say that I'm rather newbie to Python, and I've got a problem with Tkinter. I'm writing a game (exactly photonic attack), and i want to have a simulation of a game computer vs...
8
by: Chris M. Thomasson | last post by:
Here is the initial crude implmentation which compiles under Comeau with no warnings: ___________________________________________________________________ #include <cassert> #include <cstdlib>...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.